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


但是 , 这个哥们还说了一句话来兜底 。
他说:Unless i have missed something subtle about the interactions
除非我没有注意到一些非常小的细节问题 。
你看 , 说话的艺术 。 话都被他一个人说完了 。
Doug Lea在J.U.C包里面写的BUG又被网友发现了文章插图
好了 , Paul 同学发言完毕了 。 42 分钟之后 , 一个叫 Chris 的小老弟接过了话筒 , 他这样说的:
Doug Lea在J.U.C包里面写的BUG又被网友发现了文章插图
我觉得吧 , Paul 说的挺有道理的 , 我赞成他的建议 。
Doug Lea在J.U.C包里面写的BUG又被网友发现了文章插图
但是吧 , 我也觉得我们在讨论的是一个非常细节 , 非常小的问题 , 我不知道 , 就算现在这样写 , 会导致任何问题吗?
写到这里 , 先给大家捋一下:

  • Martin 老哥提出 BUG 说 FutureTask#isDone 方法没有判断 INTERRUPING 和 COMPLETING 这个两个中间状态是不对的 。
  • Paul 同学说 , 对于 INTERRUPING 这个状态 , 可以参照 isCancelled 方法 , 不需要做特殊判断 。
  • Chris 小老弟说 Paul 同学说的对 。
于是他们觉得 isDone 方法应该修改成这样:
Doug Lea在J.U.C包里面写的BUG又被网友发现了文章插图
所以 , 现在只剩下一个中间状态是有争议的了:COMPLETING。
对于剩下的这个中间状态 , 一位叫做 David 的靓仔 , 在三小时后发表了自己的意见:
Doug Lea在J.U.C包里面写的BUG又被网友发现了文章插图
他上来就是一个暴击 , 直截了当的说:我认为在座的各位都是垃圾 。
Doug Lea在J.U.C包里面写的BUG又被网友发现了文章插图
好吧 , 他没有这样说 。
其实他说的是:我认为没有必要做任何改变 。
COMPLETING 状态是一个转瞬即逝的过渡状态 , 它代表我们已经有最终状态了 , 但是在设置最终状态开始和结束的时间间隙内有一个瞬间状态 , 它就是 COMPLETING 状态 。
其实你是可以通过 get 方法知道任务是否是完成了 , 通过 get 方法你可以获得最终的正确答案 。
因为 COMPLETING 这个转瞬即逝的过渡状态是不会被程序给检测到的 。
David 靓仔的回答在两个半小时候得到了大佬的肯定:
Doug Lea在J.U.C包里面写的BUG又被网友发现了文章插图
Doug Lea 说:现在源码里面是故意这样写的 , 原因就是 David 这位靓仔说的 , 我写的时候就是这样考虑过的 。
Doug Lea在J.U.C包里面写的BUG又被网友发现了文章插图
另外 , 我觉得这个 BUG 的提交者自己应该解释我们为什么需要修改这部分代码 。
其实 Doug 的言外之意就是:你说这部分有问题 , 你给我举个例子 , 别只是整理论的 , 你弄点代码给我看看 。
Doug Lea在J.U.C包里面写的BUG又被网友发现了文章插图
半小时之后 , 这个 BUG 的提交者回复了:
Doug Lea在J.U.C包里面写的BUG又被网友发现了文章插图
intentional 知道是啥意思不?
害 , 我又得兼职教英语了:
Doug Lea在J.U.C包里面写的BUG又被网友发现了文章插图
他说:哦 , 原来是故意的呀 。


推荐阅读