Как внутри себя работают атомарные/изменчивые/синхронизированные?
В чем разница между следующими блоками кода?
Код 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
? И это потокобезопасно?
А в чем разница между внутренним чтением и записью в volatile переменные/атомарные переменные? Я читал в какой-то статье, что у потока есть локальная копия переменных — что это?