Требуется ли одноэлементная блокировка с двойной проверкой по-прежнему volatile в JDK высокой версии (например, jdk11, 14)? - PullRequest
3 голосов
/ 05 мая 2020

В синглтоне Java большинство людей говорили нам, что нам нужен volatile, чтобы предотвратить переупорядочение инструкций, но кто-то сказал мне, что volatile больше не нужен в JDK высокой версии, верно? Если да, то почему?

public class SafeDCLFactory {
  private volatile Singleton instance;

  public Singleton get() {
    if (instance == null) {  // check 1
      synchronized(this) {
        if (instance == null) { // check 2
          instance = new Singleton();
        }
      }
    }
    return instance;
  }
}

1 Ответ

4 голосов
/ 05 мая 2020

Требуется ли одноэлементная двойная проверка блокировки в JDK старшей версии (например, jdk11 или jdk14)?

Да, требуется. Все версии Java, начиная с Java 5 и далее, требуют, чтобы instance было volatile.

(До Java 5 приведенный выше код не работал надежно, независимо от того, был ли instance объявлен как volatile или нет.)

... кто-то сказал мне он больше не нуждается в летучести ...

Я бы попросил этого «кого-то» предоставить надежный источник (или доказательство «произошло до»), чтобы подтвердить свое утверждение. Если они верны, вся информация, необходимая им для построения доказательства, содержится в JLS 17.4 ... для соответствующей версии Java.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...