Ссылки AFAIK не подчиняются условию гонки, потому что JVM гарантирует, что обновление ссылки является атомарной операцией (в отличие, например, обновление long
, когда нижний и верхний 4 байта обновляются в два отдельных этапа).Как отметил SLaks, единственный критический случай - это compareAndSet
, который не является атомарным по своей природе.Это очень редко используется с нативными ссылками, но это известная идиома с AtomicReference
, когда необходимо обновить две (или более) логически зависимые переменные одновременно. Java Concurrency на практике , раздел 15.3.1 публикует пример для этого, используя AtomicReference
для обновления двух переменных (хранящихся в простом классе) в одной элементарной операции.
ОсновнойПричиной существования AtomicReference
- кроме согласованности интерфейсов - является видимость и безопасная публикация .В этом смысле атомная переменная является «лучшей volatile
».