2013-04-27 14 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, и они имеют тот же замок. Могут ли оба потока блокировать один и тот же адрес, пока они оба являются RUNNABLE? Это ошибка JRE?Несколько потоков имеют один и тот же замок?

+4

Что мы смотрим? Пожалуйста, добавьте больше контекста к вопросу. –

+0

Мой дорогой друг, пожалуйста, добавьте также соответствующий код. – Mavrick

+0

Что такое JVM? (Форматы дампа нитей не стандартизированы, не так ли?) – meriton

ответ

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

Смежные вопросы