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