`
寻墨小楼
  • 浏览: 1409 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
最近访客 更多访客>>
社区版块
存档分类
最新评论

volatile和双锁模式的代码分析

 
阅读更多
public class CachePool{
   private volatile static CachePool sharedPool;
   private CachePool(){}
   public static CachePool getSharedPool(){
      if(sharedPool==null)
      {
         synchronized(CachePool.class){
            if(sharedPool==null){
               sharedPool=new CachePool();
            }
         }
      }
      return sharedPool;
   }
   //其他方法
} 


以上是存取CachePool对象的一段代码。
这里用到了volatile和两个if block来存取唯一化的CachePool的对象。
为什么既然这里用到了volatile,为什么要用到两个if block呢?
为什么不把synchronized来定义getSharedPool()方法呢?

假设我们synchronized整个getSharedPool(),那么我们每次用CachePool.getSharedPool()去取得sharedPool对象的时候,都要执行同步,这样会对性能造成影响。因此我们把syncronized抽开,放到第一个if block里面去执行,这样就保证了,当sharedPool对象取得之后,就不用再去执行这个同步化的if block。

我们假设两个线程t1和t2,分别开始在栈1和栈2执行getSharedPool()方法,t1判断到sharedPool是null, t2也判断是null, 因此t1, t2同时进入第一个if block, 假设t1比t2稍快执行同步部分,t1就率先实例化了CachePool这个类,把实例化的sharedPool返回,并把钥匙交给t2,t2要进入这个t2内存空间的cachePool还是null吗?如果sharedPool对象没有声明volatile,t2内存里读取的值就还是null,那么就还要new一次!不过这里sharedPool被volatile了,t2和t2对这个值是共享内存,因此t2读到的不再是null,因此,不再执行第二个if block,直接返回第一个new出来的对象的引用。

之后的线程调用getSharedPool(),第一个if block之后就直接return t1实例化出来的引用了,不再执行同步化的部分。

volatie和两个if block,加上一个syncronized,保证了sharedPool的对象唯一。
分享到:
评论

相关推荐

    volatile源码分析1

    前言Java中volatile这个热门的关键字,在面试中经常会被提及,在各种技术交流群中也经常被讨论,但似乎讨论不出一个完美的结果,带着种种疑惑,准备从JVM、

    const和volatile分析

    const和volatile分析 这个分析得很好 面试 找工作 必备的

    Java并发编程:volatile关键字解析

    Java并发编程:volatile关键字解析

    深入分析Volatile的实现原理

    本文将深入分析在硬件层面上Inter处理器是如何实现Volatile的,通过深入分析能帮助我们正确的使用Volatile变量。

    Volatile详解,深入学习Volatile

    详细说明 并举例说明了VOlatile的作用及用法,特别是嵌入式程序员要注意的

    C中volatile_const解析

    C中volatile_const解析,可以让你对这两个关键字在嵌入式的过程中有更深刻的认识,从而提高你自己的c语言开发能力

    C语言中关键字volatile的作用

    C语言中关键字volatile的作用,使用说明和例子

    volatile的用法

    volatile的用法,在写代码正确使用volatile,正确理解volatile的用法,增强代码的健壮性

    volatile,nonatomic和atomic关键字测试

    主要研究四种变量(属性)的存取速度. volatile nonatomic atomic和正常变量

    java volatile 关键字实战

    java volatile 关键字实战java volatile 关键字实战java volatile 关键字实战java volatile 关键字实战java volatile 关键字实战java volatile 关键字实战java volatile 关键字实战java volatile 关键字实战java ...

    volatile和原子操作有没有关系,我的实验+别人论文

    对volatile的原子性做探究,加上自己的实验代码和实验结果! Case多核?单核?是否有volatile是否编译器优化-O2结果!

    从汇编角度理解volatile

    一般对于volatile的解释是这样的:将变量定义为volatile可以防止编译器对变量进行优化,每次均从内存中访问变量,而不是寄存器。既然让编译器优化可以提高访问速度,那为什么又要不用它以及什么时候不用它?其实主要...

    volatile的用法讲解

    volatile的用法讲解,讲得很详细,希望能帮助到大家

    volatile的使用

    一般说来,volatile用在如下的几个地方: 1、中断服务程序中修改的供其它程序检测的变量需要加volatile; 2、多任务环境下各任务间共享的标志应该加volatile; 3、存储器映射的硬件寄存器通常也要加volatile说明,...

    static,const,volatile用法

    static,const,volatile用法的解析,对三项中全局变量和局部变量的区分,volatile中介绍了其具体用法 和一些区别,bong有例子

    聊聊C++的mutable和volatile

    C++中修饰数据可变的关键字有三个:const、volatile和mutable。const比较好理解,表示其修饰的内容不可改变(至少编译期不可改变),而volatile和mutable恰好相反,指示数据总是可变的。mutable和volatile均可以和...

    volatile与synchronized的区别

    volatile与synchronized的区别,锁提供了两种主要特性:互斥(mutual exclusion) 和可见性(visibility)

    volatile和synchronized的区别

    讲解了锁的两种特性,互斥和可见;volatile和synchronize的用法和区别

    Java线程:volatile关键字

    主要讲述java线程volatile关键字

    volatile变量详解

    容易忽略的变量声明,但是很重要 volatile的作用: 作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值.

Global site tag (gtag.js) - Google Analytics