按月存档: 2012/05

通过HP-UNIX jvm获取的时间与操作系统不一致问题分析

分类:java评论:0条作者:ticmy日期:2012-05-30

如果是时区导致的问题,基本一眼能发现。 但如果相差个十几秒,找起原因也是让人大费周折。 最近就碰到一个jvm时间(System.currentTimeMillis)与操作系统时间不一致的情形,用的HP-UNIX系统,多台服务器的时间同步是用了一个NTP服务。 原因如下: hotspot jvm使用gettimeofday系统调用来获取日期和时间信息。但在HP-UX中,出于性能考虑,在应用启动后,采用了一种使用CPU 时钟周期数的机制来计算当前时间。带来的后果就是,使用date命令,adjtime函数或者形如ntp的时间同步服务工具修改系统时间后,java应用未能在重启之前反映出这种修改。如果要求操作系统时间修改立马反映到java应用中,可以使用-XX:+UseGetTimeOfDay选项来告诉JVM使用gettimeofday系统调用,但需要注意的是,这会使性能下降。 因为hotspot本身就是使用的gettimeofday系统调用,所以不会有这个问题 The HotSpot JVM uses the gettimeofday() system call to obtain date and time information. For performance reasons a new mechanism that uses the number of CPU ticks since the application started is used to calculate the current time. As a result,…
Tags: ,

重视并发安全

分类:java, 并发评论:6条作者:ticmy日期:2012-05-30

二话不说,代码如下: public class VisibilityTest extends Thread { private boolean stop; public void run() { int i = 0; while(!stop) { i++; } System.out.println("finish loop,i=" + i); } public void stopIt() { stop = true; } public boolean getStop(){ return stop; } public static void main(String[] args) throws Exception { VisibilityTest v = new VisibilityTest(); v.start(); Thread.sleep(1000); v.stopIt(); Thread.sleep(2000); System.out.println("finish main"); System.out.println(v.getStop()); } } 在hotspot中,如果是在控制台中运行,可分别尝试下面两种方式: 1、java VisibilityTest 2、java -server VisibilityTest 如果是在eclipse中,可以右键-Run As-Run Configuration-Arguments标签-VM arguments中填入-server 因为线程安全问题在-server模式下会死循环! 然后可以讲private boolean stop修改成private volatile boolean stop再看效果。 更多-client和-server的信息,以及何时会默认使用…