2

インタビューで、クラスを遅延ロードし、同期キーワードを使用しないシングルトン パターンの設計/実装を提案するように依頼されました。私は窒息してしまい、何も思いつきませんでした。それから、Java 並行性と並行 HaspMap について読み始めました。以下の実装を確認し、ダブル チェック ロックに関する問題や、この実装に関するその他の問題があるかどうかを確認してください。

package Singleton;

import java.util.concurrent.ConcurrentHashMap;

public final class SingletonMap {

    static String key = "SingletonMap";
    static ConcurrentHashMap<String, SingletonMap> singletonMap = new ConcurrentHashMap<String, SingletonMap>();
    //private constructor
    private SingletonMap(){

    }
    static SingletonMap getInstance(){

        SingletonMap map = singletonMap.get(key);       
        if (map == null){
                //SingletonMap newValue=  new SingletonMap();
                map =   singletonMap.putIfAbsent(key,new SingletonMap());
                if(map == null){
                    map = singletonMap.get(key);    
                }
        }       
        return map;
    }
}
4

2 に答える 2

3

方法さえわかればとても簡単です

enum Singleton {
    INSTANCE;
}

INSTANCE遅延ロードされ、スレッド セーフです (また、いかなる種類の明示的なロックも使用しません)。

于 2012-08-09T07:54:36.127 に答える
2

Bill Pugh のソリューションも参照してください。

public class Singleton {
    // Private constructor prevents instantiation from other classes
    private Singleton() {}

    /**
     * SingletonHolder is loaded on the first execution of
     * Singleton.getInstance() or the first access to
     * SingletonHolder.INSTANCE, not before.
     */
    private static class SingletonHolder {
        public static final Singleton INSTANCE = new Singleton();
    }

    public static Singleton getInstance() {
        return SingletonHolder.INSTANCE;
    }
}
于 2012-08-09T08:07:02.390 に答える