有关双检测锁定DCL和Singleton模式的问题•看OOP教材时,提到了一个双检测锁定(Double-CheckedLock,DCL)的问题,但是书上没有多介绍,只是说这是一个和底层内存机制有关的漏洞
查阅了下相关资料,对这个问题大致有了点了解
•从头开始说吧
•在多线程的情况下Singleton模式会遇到不少问题,一个简单的例子•1:classSingleton{•2:privatestaticSingletoninstance=null;•3:•4:publicstaticSingletoninstance(){•5:if(instance==null){•6:instance=newSingleton();•7:}•8:returninstance;•9:}•10:}•假设这样一个场景,有两个线程调用Singleton
instance(),首先线程一判断instance是否等于null,判断完后一瞬间虚拟机把线程二调度为运行线程,线程二再次判断instance是否为null,然后创建一个Singleton实例,线程二的时间片用完后,线程一被唤醒,接下来它执行的代码依然是instance=newSingleton();•两次调用返回了不同的对象,出现问题了
•最简单的方法自然是在类被载入时就初始化这个对象:privatestaticSingletoninstance=newSingleton();•JLS(JavaLanguageSpecification)中规定了一个类只会被初始化一次,所以这样做肯定是没问题的
•但是如果要实现延迟初始化(Lazyinitialization),比如这个实例初始化时的参数要在运行期才能确定,应该怎么做呢
•依然有最简单的方法:使用synchronized关键字修饰初始化方法:•1
publicsynchronizedstaticS