我们知道实现单例模式的方式有很多种,如:懒汉式加载、饿汉式、双检锁的方式实现单例,今天主要介绍一下静态内部类、枚举、cas方式实现单例
静态内部类的方式实现单例
package test;
/**
* 静态内部类实现单例
* @author lenovo
*
*/
public class InnerClassSingle {
private InnerClassSingle(){//私有化构造函数
}
private static class Holder{
private static final InnerClassSingle instance = new InnerClassSingle();
}
public static final InnerClassSingle getInstance(){
return Holder.instance;
}
}
枚举的方式实现单例
package test;
/**
* 通过枚举实现单例
* 通过EnumSingle.INSTANCE.getInstance()方法获取Resource对象
* @author lenovo
*
*/
public enum EnumSingle {
INSTANCE;
private Resource resource;
private EnumSingle() {
resource = new Resource();
}
public Resource getInstance(){
return resource;
}
}
//目标类
class Resource{
}
CAS方式实现单例
package test;
import java.util.concurrent.atomic.AtomicReference;
/**
* 通过cas操作实现单例
* 缺点:可能长时间没有获取CPU资源导致一直循环
* @author lenovo
*
*/
public class SingleCAS {
private static final SingleCAS singleCAS = null;
private static AtomicReference<SingleCAS> ref = new AtomicReference<SingleCAS>();
private SingleCAS(){//将构造函数私有化
}
public static SingleCAS getSingle(){
for(;;){
if(ref.get() != null){
return singleCAS;
}
SingleCAS single = new SingleCAS();
if(ref.compareAndSet(null, single)){
return ref.get();
}
}
}
}