JAVA设计模式中单例的思维导图如下:
1、懒汉模式,线程不安全
public class Singleton { private static Singleton instance; private Singleton (){} public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } }
2、懒汉式,线程安全
public class Singleton { private static Singleton instance; private Singleton (){} public static synchronized Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } }
3、饿汉式
public class Singleton { private static Singleton instance = new Singleton(); private Singleton (){} public static Singleton getInstance() { return instance; } }
4、双检锁/双重校验锁
双检锁的方式中用到了volatile关键字,volatile关键字的作用是可见性和禁止指令重排序。
可见性:意思是其他线程修改了被volatile标识的变量,其值可以立即同步到主内存,读取的时候也是从主内存中读取。
禁止指令重排序:在java多线程运行的时候,为了能够充分利用CPU,JVM有一些特殊的机制就是把程序执行的顺序打乱,写在后面的代码可能会先执行。而volatile禁止了这个优化。另外synchronized也禁止重排序。
public class Singleton { private volatile static Singleton singleton; private Singleton (){} public static Singleton getSingleton() { if (singleton == null) { synchronized (Singleton.class) { if (singleton == null) { singleton = new Singleton(); } } } return singleton; } }
5、登记式/静态内部类
public class Singleton { private static class SingletonHolder { private static final Singleton INSTANCE = new Singleton(); } private Singleton (){} public static final Singleton getInstance() { return SingletonHolder.INSTANCE; } }
6、枚举
public enum Singleton { INSTANCE; public void WhoIAM() { System.out.println("i am one" + this.hashCode()); } }
public class TestMain { public static void main(String[] args) { Singleton singleton1 = Singleton.INSTANCE; singleton1.WhoIAM(); Singleton singleton2 = Singleton.INSTANCE; singleton2.WhoIAM();
Singleton singleton3 = Singleton.INSTANCE;
singleton3.WhoIAM();
} }
枚举是JDK5版本后的特性,代码简单,创建枚举类之后通过Singleton.INSTANCE得到同一个实例。通过调用hashCode()方法可以知道是同一个实例。