寫給自己的單例模式手撕代碼

import java.util.concurrent.atomic.AtomicReference;

/**
 * Created by ql on 2019/5/7.
 * 手撕單例模式餓漢式,懶漢式,雙重校驗鎖,枚舉類型,靜態內部類,cas模式
 */
public class Danli {//懶漢式,但是線程不安全
    private static Danli instance = null;
    private Danli(){}
    public Danli getInstance(){
        if (instance==null){
            instance=new Danli();
        }
        return instance;
    }
}
class Singleton2{//餓漢式
    private Singleton2(){}
    private static final Singleton2 instance=new Singleton2();
    public Singleton2 getInstance(){
        return instance;
    }
}
class Singleton3{//雙重校驗鎖
    private static volatile Singleton3 instance;
    private Singleton3(){}
    public Singleton3 getInstance(){
        if (instance==null){
            synchronized (this){
                if (instance==null){
                    instance=new Singleton3();
                }
            }
        }
        return instance;
    }
}
enum Singleton4{//枚舉類型
    //private Singleton4(){}
    instance;
    public Singleton4 getInstance(){
        return Singleton4.instance;
    }
}
class Singleton5{//靜態內部類
    private Singleton5(){}
    private static class Singleton5Handler{
        public static Singleton5 instance=new Singleton5();
    }
    public Singleton5 getInstance(){
        return Singleton5Handler.instance;
    }
}
class Singleton6{//CAS方法實現單例模式
    private static final AtomicReference<Singleton6>Instance=new AtomicReference<>();//實現cas操作的類
    private Singleton6(){}
    public Singleton6 getInstance(){
        while (true){
           Singleton6 instance=Instance.get();
           if (instance!=null){
               return instance;
           }
           instance=new Singleton6();
           if (Instance.compareAndSet(null,instance)){
               return Instance.get();
           }
        }
    }
}

 

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