Решает ли этот код проблему блокировки с двойной проверкой в ​​Java?

Решает ли этот код проблему блокировки с двойной проверкой в ​​Java?

public class DBAccessService() {
    private static DBAccessService INSTANCE;  

    private DBAccessService() {}

    public static DBAccessService getInstance() {
        if (INSTANCE != null) {
            return INSTANCE;
        }
        return createInstance();
    }

    private static synchronized DBAccessService createInstance() {
        if (INSTANCE != null) {
            return INSTANCE;
        }
        DBAccessService instance = new DBAccessService();
        INSTANCE = instance;

        return INSTANCE;
    }
}

Следует обратить внимание на два аспекта:

  1. getInstance () is не синхронизировано, поэтому после инициализации INSTANCE нет затрат на синхронизацию
  2. createInstance () is synchronized

Итак, вопрос: у этого кода есть проблемы? Это законно и всегда потокобезопасно?

5
задан George Brighton 12 November 2013 в 02:01
поделиться