单例模式详解
设计模式总览
总体来说设计模式分为三大类:
创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
1、推荐方式
public class Singleton {
private static volatile Singleton instance;
private Singleton(){}
public static Singleton getInstance(){
if(instance == null){
synchronized (Singleton.class){
if(instance == null){
instance = new Singleton();
}
}
}
return instance;
}
}
2、饿汉式
public class SingletonEHan {
private static SingletonEHan instance = new SingletonEHan();
private SingletonEHan(){}
private static SingletonEHan getInstance(){
return instance;
}
}
3、懒汉式
public class SingletonLanHan {
private static SingletonLanHan instance;
private SingletonLanHan(){ }
public static SingletonLanHan getInstance(){
if(instance == null){
instance = new SingletonLanHan();
}
return instance;
}
public static void main(String[] args) {
System.out.println("instance1" + getInstance());
}
}
4、静态内部类
public class SingletonStaticInner {
private static class SingletonStaticInnerHolder{
public static SingletonStaticInner instance = new SingletonStaticInner();
}
private SingletonStaticInner(){}
public static SingletonStaticInner getInstance(){
return SingletonStaticInnerHolder.instance;
}
}
5、懒汉式(线程安全)
public class SingletonSynLanHan {
private static SingletonSynLanHan instance;
private SingletonSynLanHan(){ }
public static synchronized SingletonSynLanHan getInstance(){
if(instance == null){
instance = new SingletonSynLanHan();
}
return instance;
}
}
6、ThreadLocal方式
public class SingletonThreadLocal {
private static final ThreadLocal<SingletonThreadLocal> tlSingleton =
new ThreadLocal<SingletonThreadLocal>(){
@Override
protected SingletonThreadLocal initialValue() {
return new SingletonThreadLocal();
}
};
private SingletonThreadLocal(){}
public static SingletonThreadLocal getInstance(){
return tlSingleton.get();
}
}
7、枚举方式
public enum SingletonEnum {
INSTANCE;
public void getSingletonEnum(){
System.out.println("getSingletonEnum()");
}
public static void main(String[] args) {
SingletonEnum.INSTANCE.getSingletonEnum();
}
}
public class SingletonCAS {
private static final AtomicReference<SingletonCAS> INSTANCE = new AtomicReference<SingletonCAS>();
private SingletonCAS(){}
public static final SingletonCAS getInstance(){
for (;;){
SingletonCAS current = INSTANCE.get();
if(current != null){
return current;
}
current = new SingletonCAS();
if (INSTANCE.compareAndSet(null, current)) {
return current;
}
}
}
}