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