CentOS6 x64位平台下,JDK1.6运行环境下,Thread.sleep()的睡眠时间会因为修改系统时钟而改变。

时间:2022-09-03 02:26:14

这个文章是作为问题而发表。有遇到相同问题的朋友们一起看看,有没有解决办法,或者有没有办法让oracle去修复。

在CentOS6x64位平台下,运行JDK1.6版本的64位Java运行环境,当一个线程在运行过程中执行sleep(30000)之类的方法进入睡眠状态时,在这个过程中如果将系统时钟向后调慢1个小时,那么这个sleep的实际时间会变成一个小时+30秒。也就是说在这个运行环境下,sleep的判断依据不是cpu时间,而是根据系统的日期时间来作为判断准则了,很明显是一个bug,在java的bug库中也能找个这个bug,而且说是已经修复,且这个bug是jdk早起版本的。这个bug的链接为:http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6311057。

在Windows平台和CentOS6x32位平台已经CentOS5.6或以前的32位和64位平台上,这个bug都不存在。目前只是测试出了CentOS6的64位平台上出现了这个问题,而且这个问题对于jdk7也是一样的存在,这个bug对于服务器级别的程序来讲,某些特殊应用的情况下是致命的问题啊。搞不到Java的开发组怎么会让一个已经修复的bug再次出现的。
有很多人也许会说,为什么要过程中修改时间呢?不修改时间不是解决这个问题的办法,根据应用的背景不同,自然是存在这个需求,关键是如何解决这个bug,而java的sleep方法又是调用的native方法。真是无从下手去修改啊。有碰到过相同问题的朋友吗?