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

目录
相关文章
|
8月前
|
Java 容器
阿里内部流传的JDK源码剖析手册!GitHub已获上千万的访问量
相信现在已经有很多小伙伴知道了“微软”要对JDK下手了! JDK是什么? jdk是Java语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。jdk是整个java开发的核心,它包含了JAVA的运行环境和JAVA工具。相对而言,没有jdk的话,无法编译Java程序(指java源码.java文件),如果想只运行Java程序(指class或jar或其它归档文件),要确保已安装相应的JRE。
203 0
|
5月前
|
NoSQL Java Redis
阿里P8熬了一个月肝出这份32W字Java面试手册,在Github标星31K+
互联网行业竞争越来越严峻,面试也是越来越难,一直以来我都想整理一套完美的面试宝典,奈何难抽出时间,这套1000+道的Java面试手册我整理了整整1个月,上传到Git上目前star数达到了30K+
|
5月前
|
Java 容器
膜拜!清华大佬手撸多线程并发源码笔记Github上线3天星标35k+
你为什么要学习多线程?是因为理想吗?是因为热爱吗? 哦~原来是为了面试打基础、做准备啊!没错,这真的很现实!
膜拜!清华大佬手撸多线程并发源码笔记Github上线3天星标35k+
|
6月前
|
消息中间件 Dubbo Java
GitHub标星翻倍!阿里大牛呕心沥血终成39w字Java面试笔记
好不容易有个大厂面试机会,面试官才问了两三个问题,就已经回答不上来的,只想找个地缝钻进去,连进入技术面的机会都没有,现在大厂都在大量招聘Java工程师,但面试题怎么都这么难?!
|
8月前
|
消息中间件 Java 程序员
GitHub和 Gitee联合编写最新版20w字Java全栈面试手册,简直无敌!
最近小编发现了一份牛逼的Java全栈面试手册,这份面试手册深入到面试官和面试者的角度还原了真实的面试场景对话! 而且还是程序员两大面试巨头平台GitHub和 Gitee联手编写的,其内容可以说是在全网所有面试题中都“首屈一指”内容非常详细很多细节都给大家做了图和怎么应对面试官的问题!
GitHub和 Gitee联合编写最新版20w字Java全栈面试手册,简直无敌!
|
8月前
|
设计模式 Dubbo Java
让GitHub低头认错的这份阿里内部绝密Java面试八股文手册有多强?
今天给大家分享出一份让大家上班摸鱼也可以随意看的阿里巴巴内部特供Java面试八股文手册,这份手册据说曾经也是让GitHub都为之低头的存在! 正所谓“旧时王谢堂前燕,飞入寻常百姓家”希望大家看完这份手册都可以拿上自己满意的offer!
|
9月前
|
消息中间件 设计模式 Java
解决90%面试问题!GitHub顶级"Java面试手册"了解下八股文天花板
身为java开发工程师的你找到自己满意的工作了吗?又或者还在面试的路上经历一次又一次的失败。迟迟找不到正确的开门砖,也许你的技术能力可能并不差但就是在面试上得不到充分的证明。
|
12月前
|
存储 Rust 供应链
编写完10万行代码,我发了篇长文吐槽Rust
编写完10万行代码,我发了篇长文吐槽Rust
133 0
|
移动开发 Java 容器
这份github上被14万人点赞的Java教程太强了
这份github上被14万人点赞的Java教程太强了
185 0
这份github上被14万人点赞的Java教程太强了
|
数据可视化 开发工具 git

热门文章

最新文章