饿汉式
没有线程安全性问题
懒汉式
public class SingletonDemo2 {private static SingletonDemo2 instance;private SingletonDemo2() {}public static SingletonDemo2 getInstance() {if(instance==null) {instance=new SingletonDemo2();}return instance;}}
如果遇到多线程。上面的代码会返回不同的 SingletonDemo2 实例。违背了单例设计。
需要加上 synchronized 关键字。如下:
public synchronized static SingletonDemo2 getInstance() {if(instance==null) {instance=new SingletonDemo2();}return instance;}
虽然解决了 “
返回不同的
SingletonDemo2 实例”问题,但是在线程很多得时候,性能不好,因为
synchronized 放在静态方法上,内置锁就是当前类的Class字节码对象,当一些偏向锁,轻量级锁过来的时候,都会失去它们性能优势,变成像 重量级锁一样。因而还不是最好的方法,需要改进。
最终版本:
public class Singleton2 {private Singleton2() {}//volatile 防止jvm 指令重排序private static volatile Singleton2 instance;public static Singleton2 getInstance(){if(instance==null) {synchronized (Singleton2.class) {if(instance==null) {instance=new Singleton2();}}}return instance;}
}