private int counter;
public int getNextUniqueIndex() {
return counter++;
}
< /code>
код 2 < /p>
private AtomicInteger counter;
public int getNextUniqueIndex() {
return counter.getAndIncrement();
}
< /code>
code 3 < /p>
private volatile int counter;
public int getNextUniqueIndex() {
return counter++;
}
< /code>
Работает ли volatile < /code> следующим образом? < /P>
volatile int i = 0;
void incIBy5() {
i += 5;
}
< /code>
эквивалентно < /p>
Integer i = 5;
void incIBy5() {
int temp;
synchronized(i) { temp = i }
synchronized(i) { i = temp + 5 }
}
< /code>
Я думаю, что два потока не могут ввести синхронизированный блок одновременно ... Я прав? Если это правда, то как Atomic.incrementAndget ()
работает без синхронизации ? И это безопасно ли? В какой -то статье я прочитал, что в потоке есть локальная копия переменных - что это?
Как атомная /летучая /синхронизированная работа внутри? код 1 < /p>
[code]private int counter;
public int getNextUniqueIndex() { return counter++; } < /code>
код 2 < /p>
private AtomicInteger counter;
public int getNextUniqueIndex() { return counter.getAndIncrement(); } < /code>
code 3 < /p>
private volatile int counter;
public int getNextUniqueIndex() { return counter++; } < /code>
Работает ли volatile < /code> следующим образом? < /P>
volatile int i = 0; void incIBy5() { i += 5; } < /code>
эквивалентно < /p>
Integer i = 5; void incIBy5() { int temp; synchronized(i) { temp = i } synchronized(i) { i = temp + 5 } } < /code>
Я думаю, что два потока не могут ввести синхронизированный блок одновременно ... Я прав? Если это правда, то как Atomic.incrementAndget () [/code] работает без синхронизации ? И это безопасно ли? В какой -то статье я прочитал, что в потоке есть локальная копия переменных - что это?