このコードは、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;
}
}
注意すべき点が 2 つあります。
getInstance()は同期されないため、INSTANCE が初期化された後、同期のコストはかかりませんcreateInstance()同期されています
問題は、このコードに何か問題があるかどうかです。それは合法で、常にスレッドセーフですか?