Предложение говорит об этом примере:
public class CounterClass {
private volatile int counter;
public int increment() {
return counter++;
}
}
Хотя counter
имеет модификатор volatile
, не гарантируется, что если два потока получат доступ к методу increment()
, то два разных целых числавернулся.Потому что операция counter++
не является атомарной.Это get, increment, return
.Возможно, что два потока вызывают increment()
одновременно, и что первый поток находится в фазе get
, а второй поток находится в фазе get
до того, как первый поток находится в фазе increment
.
Резюме: volatile
не гарантирует атомарность или что-то еще.Это просто гарантирует, что при доступе к переменной вы не получите старое кэшированное значение.Но это не гарантирует никакой безопасности или атомарности нити.