最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

双检锁(DCL)实现懒汉单例模式_全球讯息

来源:博客园


(资料图)

public class Singleton{    private volatile static Singleton obj;    public Singleton(){}    public getSingleton(){        if(singleton == null){            synchronized(Singleton.class){                if(singleton == null){                    obj = new Singleton();                }            }        }        return obj;    }}
  • 为什么使用两次if判断?因为多线程环境下只有创建单例对象时才会产生竞争。如果已经有实例化对象,则不需要进入加锁的步骤,直接返回,提高效率。第二次判断是防止创建出多个实例,多个线程进入第一个if时,一个线程释放了锁,其他线程会获取锁,从而导致多个实例创建,第二个if就是为了避免创建多个实例。
  • 为什么使用了synchronized关键字还要使用volatile关键字?synchronized是为了保证多线程环境下的线程安全,而volatile是为了禁止指令重排。

关键词: