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();
}
}
}
}