Doug Lea在J.U.C包里面写的BUG又被网友发现了( 四 )
这句话 , 你用不同的语气可以读出不同的含义 。
我这里倾向于他觉得既然 Doug 当初写这段代码的时候考虑到了这点 , 他分析之后觉得自己这样写是没有问题的 , 就这样写了 。
好嘛 , 前面说 INTERRUPING 不需要特殊处理 , 现在说 COMPLETING 状态是检测不到的 。
那就没得玩了 。
文章插图
事情现在看起来已经是被定性了 , 那就是不需要进行修改 。
但是就在这时 Paul 同学杀了个回马枪 , 应该也是前面的讨论激发了他的思路 , 你不是说检测不出来吗 , 你不是说 get 方法可以获得最终的正确结果吗?
那你看看我这段代码是什么情况:
文章插图
代码是这样的 , 大家可以直接粘贴出来 , 在 JDK 8/9 环境下分别运行一下:
public static void main(String[] args) throws Exception {AtomicReference
先看一下这段代码的核心逻辑:
文章插图
首先标号为 ① 的地方是两个计数器 , c 代表的是第一个 while 循环的次数 , ic 代表的是抛出 InterruptedException(IE) 的次数 。
标号为 ② 的地方是判断当前任务是否是完成状态 , 如果是 , 则继续往下 。
标号为 ③ 的地方是先中断当前线程 , 然后调用 get 方法获取任务结果 。
标号为 ④ 的地方是如果 get 方法抛出了 IE 异常 , 则在这里进行记录 , 打印日志 。
需要注意的是 , 如果打印日志了 , 说明了一个问题:
前面明明 isDone 方法返回 true 了 , 说明方法执行完成了 。 但是我调用 get 方法的时候却抛出了 IE 异常?
这你怕是有点说不通吧!
JDK 8 的运行结果我给大家截个图 。
文章插图
这个异常是在哪里被抛出来的呢?
awaitDone 方法的入口处 , 就先检查了当前线程是否被中断 , 如果被中断了 , 那么抛出 IE 异常:
文章插图
而代码怎么样才能执行到 awaitDone 方法呢?
推荐阅读
- Clearbot:一款能自动在水上追踪收集垃圾的机器人
- Clearfind:帮企业合理规划软件投入 寻找最适合方案
- 齿间洁净 时刻自信 Oclean W1冲牙器抢先体验
- 冲牙器|Oclean W1便携式智能空气动力冲牙器体验:极致便携的小钢炮,给足了让你带上它旅行的理由
- 极致静音体验 Oclean Air2电动牙刷评测
- Google推出XS-Leaks Wiki 普及有关跨站泄露的网络安全知识
- DeepLearningwithPyTorch-1.0 简介
- 猫咪高冷不让抱 Leader空调Home一键秒变“粘人精”
- 乐谈科技|W1智能冲牙器评测:空气动力值得一试,体积最小的Oclean
- 小熊在线|Oclean Air 2超静音电动牙刷图赏,静享私密时刻