JDK中的并发bug?
2015-05-08 11:59
141 查看
最近研究Java并发,无意中在JDK8的System.console()方法的源码中翻到了下面的一段代码:
第一感觉,这个不是很像著名的双重检查加锁吗?再仔细一看,似乎有bug,似乎应该这样写的:
这个才是正确的 双重检查加锁 的正确写法。
那么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,请知道其中原委高手指点......
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,请知道其中原委高手指点......
相关文章推荐
- JDK1.8.0_151 bug 泛型
- java特种兵读书笔记(5-4)——并发之JDK
- Eclipse解决bug:JDK是8.0,打不开eclipse
- Java并发程序设计(四)JDK并发包之同步控制
- 处理系统中一个并发引起的bug
- JDK并发容器
- JDK 5.0 Concurrency Utilities 并发处理(2)Condition 条件变量
- 高并发下Netty4底层bug导致直接内存溢出分析
- ImageIO并发情况下内存溢出问题(jdk1.7以下)
- jdk源码解读-并发包-Lock-ReentrantLock(1)--lock()与unlock()方法走读
- JDK并发工具类源码学习系列——PriorityBlockingQueue
- jdk1.8并发容器:ConcurrentHashMap源码分析
- JDK容器与并发—Map—ConcurrentSkipListMap
- 《Java Concurrency》读书笔记,使用JDK并发包构建程序
- Java高并发程序-Chapter3 JDK并发包(第十讲)同步控制之 Condition
- java高并发程序设计总结五:jdk并发包其他同步控制工具类:ReadWriteLock/CountDownLatch/CyclicBarrier/LockSupport
- jdk 10.0.2 bug修复
- JDK 5.0中的并发-----整理自IBM-900
- JDK并发数据结构
- jdk1.4 构建 java多线程,并发设计框架 使用列子(一)