2014-09-22 223 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