黑马程序员技术交流社区
标题:
Java单例双检测模式的详解
[打印本页]
作者:
瑞雪雄起
时间:
2015-10-10 18:46
标题:
Java单例双检测模式的详解
本帖最后由 瑞雪雄起 于 2015-10-10 18:49 编辑
if(Instance==null) 该语句非原子操作,它首先getstatic(read 操作),然后才是判断操作,在某一时刻只有一个线程访问read 操作的话,那么根据流水线规则,在第一个线程完成read操作之后,它将进入判断操作,那么此时另一个线程即可进行read操作。那么此时它读到的值也是null。所以要在synchronized块中进行第二次判断。那么它此时就需要重新进行读取和判断.因为第一个线程已经在synchronized块中修改了,所以给改的值迅速写回主存(putstatic).
synchronized(Singleton.class)
{
if(Instance==null)
Instance=new Singleton()
}
return Instance;
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2