实现单例模式的方法有好几种,例如饿汉式、懒汉式、双重检查。其中双重检查才适用于多线程的情况,其他代码都会造成线程不安全,例如:
1 | public class Singleton{ |
若有两个线程A和B同时访问上述代码,线程A检查到singleton为空,在还没有创建实例前,线程B进来了,它也检查到singleton为空,那么最后会生成两个实例对象,这违背了单例模式的定义。
那么,为了解决上述问题,我们可以对getInstance()方法进行加锁。但是用synchronized直接对方法加锁会导致很大的性能开销。更好的方法是使用双重检查锁:
1 | //错误的方法 |