"dashboardRefreshContainer-8" - Thread t@1384
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 t@158
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错误吗?
答案 0 :(得分: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();
}
}