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的对象唯一。
分享到:
相关推荐
前言Java中volatile这个热门的关键字,在面试中经常会被提及,在各种技术交流群中也经常被讨论,但似乎讨论不出一个完美的结果,带着种种疑惑,准备从JVM、
const和volatile分析 这个分析得很好 面试 找工作 必备的
Java并发编程:volatile关键字解析
本文将深入分析在硬件层面上Inter处理器是如何实现Volatile的,通过深入分析能帮助我们正确的使用Volatile变量。
详细说明 并举例说明了VOlatile的作用及用法,特别是嵌入式程序员要注意的
C中volatile_const解析,可以让你对这两个关键字在嵌入式的过程中有更深刻的认识,从而提高你自己的c语言开发能力
C语言中关键字volatile的作用,使用说明和例子
volatile的用法,在写代码正确使用volatile,正确理解volatile的用法,增强代码的健壮性
主要研究四种变量(属性)的存取速度. volatile nonatomic atomic和正常变量
java volatile 关键字实战java volatile 关键字实战java volatile 关键字实战java volatile 关键字实战java volatile 关键字实战java volatile 关键字实战java volatile 关键字实战java volatile 关键字实战java ...
对volatile的原子性做探究,加上自己的实验代码和实验结果! Case多核?单核?是否有volatile是否编译器优化-O2结果!
一般对于volatile的解释是这样的:将变量定义为volatile可以防止编译器对变量进行优化,每次均从内存中访问变量,而不是寄存器。既然让编译器优化可以提高访问速度,那为什么又要不用它以及什么时候不用它?其实主要...
volatile的用法讲解,讲得很详细,希望能帮助到大家
一般说来,volatile用在如下的几个地方: 1、中断服务程序中修改的供其它程序检测的变量需要加volatile; 2、多任务环境下各任务间共享的标志应该加volatile; 3、存储器映射的硬件寄存器通常也要加volatile说明,...
static,const,volatile用法的解析,对三项中全局变量和局部变量的区分,volatile中介绍了其具体用法 和一些区别,bong有例子
C++中修饰数据可变的关键字有三个:const、volatile和mutable。const比较好理解,表示其修饰的内容不可改变(至少编译期不可改变),而volatile和mutable恰好相反,指示数据总是可变的。mutable和volatile均可以和...
volatile与synchronized的区别,锁提供了两种主要特性:互斥(mutual exclusion) 和可见性(visibility)
讲解了锁的两种特性,互斥和可见;volatile和synchronize的用法和区别
主要讲述java线程volatile关键字
容易忽略的变量声明,但是很重要 volatile的作用: 作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值.