JDK中的并发bug?
最近研究Java并发,无意中在JDK8的System.console()方法的源码中翻到了下面的一段代码:
private static volatile Console cons = null;
/**
* Returns the unique {@link java.io.Console Console} object associated
* with the current Java virtual machine, if any.
*
* @return The system console, if any, otherwise <tt>null</tt>.
*
* @since 1.6
*/
public static Console console() {
if (cons == null) {
synchronized (System.class) {
cons = sun.misc.SharedSecrets.getJavaIOAccess().console();
}
}
return cons;
}
第一感觉,这个不是很像著名的双重检查加锁吗?再仔细一看,似乎有bug,似乎应该这样写的:
     public static Console console() {
         if (cons == null) {
             synchronized (System.class) {
                  if (cons == null)
                        cons = sun.misc.SharedSecrets.getJavaIOAccess().console();
             }
         }
         return cons;
     }
这个才是正确的 双重检查加锁 的正确写法。
那么JDK中的写法似乎是有问题的:
假如a,b两个线程执行到 if (cons == null) {  之后,然后a线程进入锁,获得了一个 cons对象,出锁,然后b线程在进入锁,又获得了一个不同的 cons对象,这样的话就和注释中的:Returns the unique {@link java.io.Console Console} object associated
     * with the current Java virtual machine, if any.
矛盾了。
另外如果sun.misc.SharedSecrets.getJavaIOAccess().console();每次返回都是相同的 对象,那就没有必要使用synchronized (System.class) 锁了。
但是一想,如果JDK发生这样低级的bug,又感觉不太可能吧,但是自己从代码上看又确实有bug,请知道其中原委高手指点......
JDK中的并发bug?的更多相关文章
- 应用服务器中对JDK的epoll空转bug的处理
		
原文链接:应用服务器中对JDK的epoll空转bug的处理 前面讲到了epoll的一些机制,与select和poll等传统古老的IO多路复用机制的一些区别,这些区别实质可以总结为一句话, 就是epol ...
 - Java7中的ForkJoin并发框架初探(中)——JDK中实现简要分析
		
原文发表于 2013 年 8 月 28 日 由 三石 根据前文描述的Doug Lea的理论基础,在JDK1.7中已经给出了Fork Join的实现.在Java SE 7的API中,多了ForkJoin ...
 - [转]Java7中的ForkJoin并发框架初探(中)——JDK中实现简要分析
		
详见: http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp85 根据前文描述的Doug Lea的理论基础,在JDK1.7中已经给 ...
 - 【并发编程】Future模式及JDK中的实现
		
1.1.Future模式是什么 先简单举个例子介绍,当我们平时写一个函数,函数里的语句一行行同步执行,如果某一行执行很慢,程序就必须等待,直到执行结束才返回结果:但有时我们可能并不急着需要其中某行的执 ...
 - jdk中的简单并发,需要掌握
		
前言 开心一刻 小时候有一次爸爸带我去偷村头别人家的梨子,我上树摘,爸爸在下面放风,正摘着主人来了,爸爸指着我破口大骂:臭小子,赶紧给我滚下来,敢偷吃别人家梨子,看我不打死你.主人家赶紧说:没事没事, ...
 - Java并发(10)- 简单聊聊JDK中的七大阻塞队列
		
引言 JDK中除了上文提到的各种并发容器,还提供了丰富的阻塞队列.阻塞队列统一实现了BlockingQueue接口,BlockingQueue接口在java.util包Queue接口的基础上提供了pu ...
 - Java并发编程系列-(9) JDK 8/9/10中的并发
		
9.1 CompletableFuture CompletableFuture是JDK 8中引入的工具类,实现了Future接口,对以往的FutureTask的功能进行了增强. 手动设置完成状态 Co ...
 - Java并发编程:JDK中的阻塞队列
		
上次我们讲了一些常用的4个阻塞队列,但是在JDK中还提供了其他的一些阻塞队列.这篇文章将全面介绍一下JDK中的所有阻塞队列,并比较他们的区别. JDK7提供了7个阻塞队列.分别是 ArrayBlock ...
 - 深入理解JDK中的I/O
		
深入理解JDK中的I/O 目 录 java内存模型GCHTTP协议事务隔离级并发多线程设计模式清楚redis.memcache并且知道区别mysql分表分库有接口幂等性了解jdk8稍微了解一下特性 j ...
 
随机推荐
- 说说jsonp
			
什么是jsonp jsonp充其量只能说是一种"方法".它可以让页面从其他域中获取资料. 首先要知道的是同源策略,在javascript中使用http请求(ajax)是会受到同 ...
 - 转载:第六弹!全球首个微信小程序(应用号)开发教程!通宵吐血赶稿!
			
大家好!博卡君原计划是能在国庆假期前把小程序的开发教程做完,给大家一套完整.系统的东西,不过由于最近小程序开发工具的拍照组件尚未完善,很多功能还不能顺利实现.我考虑了一下,觉得不如把拍照部分的一些代码 ...
 - 数论 - 算数基本定理的运用 --- nefu  118 : n!后面有多少个0
			
题目链接:http://acm.nefu.edu.cn/JudgeOnline/problemshow.php Mean: 略. analyse: 刚开始想了半天都没想出来,数据这么大,难道是有什么 ...
 - c++转C#
			
//c++:HANDLE(void *) ---- c#:System.IntPtr //c++:Byte(unsigned char) ---- ...
 - 译:在ASP.NET MVC5中如何使用Apache log4net 类库来记录日志
			
译文出处:http://www.codeproject.com/Articles/823247/How-to-use-Apache-log-net-library-with-ASP-NET-MVC 在 ...
 - C#中CookieContainer获取里面cookie值异常:InvokeMember("m_domainTable")  FieldAccessException
			
1.可能是主机提供商的 安全问题. Their hosts works in medium trustsecurity, and ASProxy needs a full trust security ...
 - c#通用递归生成无限层级树
			
NewsType结构: Id ParentId Name children(List<NewsType>) public void LoopToAppendChildren(List< ...
 - 3. Node.js REPL(交互式解释器)
			
1. 双击安装完成的Node.js 或者在 cmd 中 执行"node" 可以启动node 的终端. 2. 在node终端中可以输入一些javascript语法, 例如: > ...
 - 重新想象 Windows 8 Store Apps (65) - 后台任务: 音乐的后台播放和控制
			
[源码下载] 重新想象 Windows 8 Store Apps (65) - 后台任务: 音乐的后台播放和控制 作者:webabcd 介绍重新想象 Windows 8 Store Apps 之 后台 ...
 - Ubuntu配置任意版本的apt-get镜像
			
我们知道,迄今为止,Ubuntu已有多个发行版,如11.04.11.10,以至于现在最新的16.*.而我们平常通过apt-get来安装软件,如果OS版本不同,那么镜像源的配置就不同,否则就会出现找不到 ...