double-checked locking设计实现单例模式 优点: 1.线程安全——synchronized锁 2.性能优化——double-checked,把锁加instance == null的if判断里的代码块上,比加在getInstance()方法上或者instance == null的if判断外性能更优。
public class SingletonClass { private static SingletonClass instance = null; public static SingletonClass getInstance() { if (instance == null) { synchronized (SingletonClass.class) { if (instance == null) { instance = new SingletonClass(); } } } return instance; } private SingletonClass() { } }缺点:即使加了锁,在多线程并发时,如果有线程判断出了instance为null,并且把引用赋值给了instance,但是new singletonclass()并没有完成构造,此时有另一线程去判断时,instance不时null,直接返回了,这样该线程使用的是没有完成构造的instance对象引用,是有问题的。 解决方案:使用静态内部类
public class SingletonClass { private static class SingletonClassInstance { private static final SingletonClass instance = new SingletonClass(); } public static SingletonClass getInstance() { return SingletonClassInstance.instance; } private SingletonClass() { } }Java语言规定,对于每一个类和接口C,都有一个唯一的初始化锁LC与之对应。从C到LC的映射,由JVM的具体实现去自由实现。JVM在类初始化期间会获取这个初始化锁,并且每个线程至少获取一次锁来确保这个类已经被初始化过了 参考:http://bbs.csdn.net/topics/391840031