2014-09-22 219 views
0

,存在锁定的线程,因为我得到线程转储,它似乎是关于java.util.Calendar类,则使用Calendar.getInstance()创建对象,该对象返回new实例。你有任何评论。 这里是一个线程转储的例子;java.util.Calendar.get *和java.util.Calendar.set *在多线程应用程序中阻塞

"QuartzScheduler_Worker-128" prio=10 tid=0x00007f48844fe800 nid=0xb75f runnable [0x00007f43f01bd000] 
    java.lang.Thread.State: RUNNABLE 
     at java.util.SimpleTimeZone.getOffset(SimpleTimeZone.java:656) 
     - locked <0x00007f4950c99780> (a java.util.SimpleTimeZone) 
     at java.util.SimpleTimeZone.getOffsets(SimpleTimeZone.java:550) 
     at java.util.SimpleTimeZone.getOffset(SimpleTimeZone.java:522) 
     ... 


"QuartzScheduler_Worker-124" prio=10 tid=0x00007f48844f6800 nid=0xb75a waiting for monitor entry [0x00007f43f05c3000] 
    java.lang.Thread.State: BLOCKED (on object monitor) 
     at java.util.SimpleTimeZone.getOffsets(SimpleTimeZone.java:533) 
     - waiting to lock <0x00007f4950c99780> (a java.util.SimpleTimeZone) 
     at java.util.SimpleTimeZone.getOffset(SimpleTimeZone.java:522) 
     at java.util.SimpleTimeZone.inDaylightTime(SimpleTimeZone.java:834) 
     at sun.util.calendar.ZoneInfo.getOffsets(ZoneInfo.java:282) 
     ... 

编辑:JDK版本是1.6._021

+0

你是否创建一个日历对象并在线程之间共享或者你每个线程有一个对象?日历不是线程安全的,所以你必须做后者。 – shazin 2014-09-22 06:59:48

+0

使用Calendar.getInstance方法为每个线程创建日历,该方法返回新的Calendar对象。 – dursun 2014-09-22 07:10:11

回答

1

我觉得你只是设法采取线程转储的瞬间两个线程都在竞争一个共享SimpleTimeZone对象的锁。一个线程持有锁并且可以运行。另一个线程正在等待锁定。

对我而言,没有什么特别值得注意的。我发现java.util.SimpleTimeZone的版本并没有透露任何有趣的东西提示:在JDK中为了精确版本的Java,你应该找到这个库的源代码的ZIP文件,看看这个类的源代码....)

+0

我添加了jdk版本,它是1.6.0_21 – dursun 2014-09-22 07:14:48

+0

我不能轻松访问1.6.0_21的源代码。你做。 – 2014-09-22 11:00:23