В чем разница между атомарным/изменчивым/синхронизированным?

Как внутри себя работают атомарные/изменчивые/синхронизированные?

В чем разница между следующими блоками кода?

Код 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 переменные/атомарные переменные? Я читал в какой-то статье, что у потока есть локальная копия переменных — что это?

282
задан PhoenixPan 9 November 2017 в 04:39
поделиться