Doug Lea在J.U.C包里面写的BUG又被网友发现了(4)

简介: Doug Lea在J.U.C包里面写的BUG又被网友发现了(4)

他说他改变主意了。


改变什么主意了?他之前的主意是什么?


在 Doug 说他是故意这样写的之后,Martin 说:


It's intentional。哦,原来是故意的呀。


那个时候他的主意就是:大佬都说了,这样写是考虑过的,肯定没有问题。


现在他的主意是:如果 isDone 方法返回了 true,那么 get 方法应该明确的返回结果值,而不会抛出 IE 异常。


需要注意的是,这个时候对于 BUG 的描述已经发生变化了。


从“FutureTask.isDone 方法在任务还没有完成的时候就会返回 true”变成了“如果


isDone 方法返回了 true,那么 get 方法应该明确的返回结果值,而不会抛出 IE 异常”。


然后 David 靓仔给出了一个最简单的解决方案:



image.png


最简单的解决方案就是先检查状态,再检查当前线程是否中断。


然后,这个 BUG 由 Martin 同学进行了修复:


微信图片_20220426230151.png


修复的代码可以先不看,下面一小节我会给大家做个对比。


他修复的同时还小心翼翼的要求 Doug 祝福他,为他站个台。


最后,Martin 同学说他已经提交给了 jsr166,预计在 JDK 9 版本进行修复。


出于好奇,我在 JDK 的源码中搜索了一下 Martin 同学的名字,本以为是个青铜,没想到是个王者,失敬失敬:


image.png


代码对比


既然说在 JDK 9 中对该 BUG 进行了修复,那么带大家对比一下 JDK 9/8 的代码。


java.util.concurrent.FutureTask#awaitDone:


微信图片_20220426230230.png


可以看到,JDK 9 把检查是否中断的操作延后了一步。


代码修改为这样后,把之前的那段示例代码放到 JDK 9 上面跑一下,你会惊奇的发现,没有抛出异常了。


因为源码里面判断 COMPLETING 的操作在判断线程中断标识之前:


image.png


它说:isDone 方法已经告诉使用者任务已经完成了,那么调用 get 方法的时候我们就不应该什么都不返回或者抛出一个 IE 异常。


这行注释想要表达的东西,就是上面一小节的 BUG 里面我们在讨论的事情。写这行注释的人,就是 Martin 同学。


当我了解了这个 BUG 的来龙去脉之后,又突然间在 JDK 9 的源码里面看到这个注释的时候,有一种很神奇的感觉。


就是一种源码说:you feel me?


我马上心领神会:I get you。


挺好。


image.png

目录
相关文章
|
1月前
|
安全 Java 编译器
一个 Bug JDK 居然改了十年?
你敢相信么一个简单的Bug,JDK 居然花了十年时间才修改完成。赶快来看看到底是个什么样的 Bug?
38 1
一个 Bug JDK 居然改了十年?
|
8月前
|
安全 easyexcel 数据库
Doug Lea大师的佳作CopyOnWriteArrayList,用不好能坑死你!
【5月更文挑战第14天】Doug Lea大师的佳作CopyOnWriteArrayList,用不好能坑死你!
57 4
|
存储 算法 Linux
当我用几道题考了一遍做Linux驱动的同事......
当我用几道题考了一遍做Linux驱动的同事......
|
JavaScript 前端开发 Linux
2022 我用 MacBook Pro 整一年 【感想 与 踩坑指南】
2022 我用 MacBook Pro 整一年 【感想 与 踩坑指南】
256 0
Java小白翻身教程-链表结构与编译大法(3)
D盘下面的tool文件夹已经有三个工具类了(其实是两个,CustNode是为了TuziLinkedList服务的),我们这一节来进行打包,这样的好处就是不用每次编译都把tool里面的类也带上了。
|
IDE Java 开发工具
Java小白翻身教程-链表结构与编译大法(4)
tools.jar是刚打出来的工具包,现在把它导入项目。
Java小白翻身教程-链表结构与编译大法(1)
咳咳,我是小白,没错,主线剧情又回来了。现在我遇到麻烦了,老板要我设计一个类,可以用来保存多个客户的资料。
113 0
|
存储 编译器 C语言
C语言指针,楼下大爷都能学会的小细节(和bug郭一起学C系列)
C语言指针,楼下大爷都能学会的小细节(和bug郭一起学C系列)
110 0
C语言指针,楼下大爷都能学会的小细节(和bug郭一起学C系列)
|
Java API
Doug Lea在J.U.C包里面写的BUG又被网友发现了(5)
Doug Lea在J.U.C包里面写的BUG又被网友发现了(5)
111 0
Doug Lea在J.U.C包里面写的BUG又被网友发现了(5)
Doug Lea在J.U.C包里面写的BUG又被网友发现了(2)
Doug Lea在J.U.C包里面写的BUG又被网友发现了(2)
116 0
Doug Lea在J.U.C包里面写的BUG又被网友发现了(2)

热门文章

最新文章

下一篇
开通oss服务