2013-04-27 53 views
4
"dashboardRefreshContainer-8" - Thread [email protected] 
    java.lang.Thread.State: RUNNABLE 
    at sun.util.calendar.ZoneInfo.getLastRule(ZoneInfo.java:638) 
    - locked <4d70153e> (a sun.util.calendar.ZoneInfo) 
    at sun.util.calendar.ZoneInfo.getOffsets(ZoneInfo.java:275) 
    at sun.util.calendar.ZoneInfo.getOffsets(ZoneInfo.java:225) 
    at java.util.GregorianCalendar.computeFields(GregorianCalendar.java:2024) 
    at java.util.GregorianCalendar.computeFields(GregorianCalendar.java:1996) 
    at java.util.Calendar.setTimeInMillis(Calendar.java:1109) 
    at java.util.Calendar.setTime(Calendar.java:1075) 

"TP-Processor38" - Thread [email protected] 
    java.lang.Thread.State: RUNNABLE 
    at sun.util.calendar.ZoneInfo.getLastRule(ZoneInfo.java:638) 
    - locked <4d70153e> (a sun.util.calendar.ZoneInfo) 
    at sun.util.calendar.ZoneInfo.getOffsets(ZoneInfo.java:275) 
    at sun.util.calendar.ZoneInfo.getOffsets(ZoneInfo.java:225) 
    at java.util.GregorianCalendar.computeFields(GregorianCalendar.java:2024) 
    at java.util.GregorianCalendar.computeFields(GregorianCalendar.java:1996) 
    at java.util.Calendar.setTimeInMillis(Calendar.java:1109) 
    at java.util.Calendar.setTime(Calendar.java:1075) 

线程都是可运行的,并且它们拥有相同的锁。 两个线程都可以锁定相同的地址,但它们都是RUNNABLE?这是一个JRE错误吗?多个线程持有相同的锁?

+4

我们寻找什么样的:

行为可以很容易地与以下程序重现?请在问题中添加更多上下文。 – 2013-04-27 08:26:12

+0

我的亲爱的朋友请加上相关的代码。 – Mavrick 2013-04-27 09:14:09

+0

这是什么JVM? (线程转储格式是不是标准化,是吗?) – meriton 2013-04-27 09:14:32

回答

11

该问题仅存在于线程转储中。事实上,在任何时候,锁都由一个线程保存。但是,线程转储使用同一个锁显示两个不同的线程,因为它不是原子的。

public class Test { 
    public static void main(String[] args) { 
     Runnable runnable = new Runnable() { 
      public void run() { 
       for (;;) { 
        synchronized (this) { } 
       } 
      } 
     }; 
     new Thread(runnable).start(); 
     new Thread(runnable).start(); 
    } 
} 
+1

我用它作为测试用例来提交Oracle的一个错误:https://bugs.openjdk.java.net/browse/JDK-8036823 – rxg 2014-04-07 12:04:40