單例的幾種創建方法

package singleton;
 
/**
 * @author lei
 * 單例模式的五種寫法:
 * 1、懶漢
 * 2、餓漢
 * 3、靜態內部類
 * 4、枚舉
 * 5、雙重校驗鎖
 * 2011-9-6
 */
/**
 *五、 雙重校驗鎖,在當前的內存模型中無效
 */
class LockSingleton{
    private volatile static LockSingleton singleton;
    private LockSingleton(){}
     
    //詳見:http://www.ibm.com/developerworks/cn/java/j-dcl.html
    public static LockSingleton getInstance(){
        if(singleton==null){
            synchronized(LockSingleton.class){
                if(singleton==null){
                    singleton=new LockSingleton();
                }
            }
        }
        return singleton;
    }
     
}
/**
 * 四、枚舉,《Effective Java》作者推薦使用的方法,優點:不僅能避免多線程同步問題,
 *     而且還能防止反序列化重新創建新的對象
 */
enum EnumSingleton{
    INSTANCE;
    public void doSomeThing(){
    }
}
/**
 * 三、靜態內部類 優點:加載時不會初始化靜態變量INSTANCE,因爲沒有主動使用,
 *    達到Lazy loading
 */
class InternalSingleton{
    private static class SingletonHolder{
        private final static  InternalSingleton INSTANCE=new InternalSingleton();
    }   
    private InternalSingleton(){}
    public static InternalSingleton getInstance(){
        return SingletonHolder.INSTANCE;
    }
}
/**
 * 二、餓漢,缺點:沒有達到lazy loading的效果
 */
class HungrySingleton{
    private static HungrySingleton singleton=new HungrySingleton();
    private HungrySingleton(){}
    public static HungrySingleton getInstance(){
        return singleton;
    }
}
/**
 * 一、懶漢,常用的寫法
 */
class LazySingleton{
    private static LazySingleton singleton;
    private LazySingleton(){
    }
    public static LazySingleton getInstance(){
        if(singleton==null){
            singleton=new LazySingleton();
        }
        return singleton;
    }   
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章