Решает ли этот код проблему блокировки с двойной проверкой в 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;
}
}
Следует обратить внимание на два аспекта:
getInstance ()
is не синхронизировано, поэтому после инициализации INSTANCE нет затрат на синхронизацию createInstance ()
is synchronized Итак, вопрос: у этого кода есть проблемы? Это законно и всегда потокобезопасно?