java.util.Calendar.get* 和 java.util.Calendar.set* 被阻塞

Posted

技术标签:

【中文标题】java.util.Calendar.get* 和 java.util.Calendar.set* 被阻塞【英文标题】:java.util.Calendar.get* and java.util.Calendar.set* are blocking 【发布时间】:2014-11-16 01:29:11 【问题描述】:

在多线程应用程序中,有锁定的线程,当我得到线程转储时,它似乎与 java.util.Calendar 类有关,该对象是使用 Calendar.getInstance() 创建的,它返回 new 实例。你有什么意见吗。 这是线程转储的示例;

"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

【问题讨论】:

您是创建一个日历对象并在线程之间共享,还是每个线程只有一个对象?日历不是线程安全的,因此您必须执行后者。 日历是使用返回新日历对象的 Calendar.getInstance 方法为每个线程创建的。 【参考方案1】:

我认为您只是在两个线程争用共享SimpleTimeZone 对象上的锁时进行了线程转储。一个线程持有锁并且可以运行。另一个线程正在等待锁。

在我看来,这没有什么特别值得注意的。

(我在网上找不到与这些行号精确匹配的源代码。但我能找到的java.util.SimpleTimeZone 的版本并没有揭示任何有趣的东西。提示:在JDK 中您正在使用的 Java 的精确版本,您应该找到库源代码的 ZIP 文件。查看此类的源代码 ....)

【讨论】:

我添加了jdk版本1.6.0_21 我无法轻松访问 1.6.0_21 的源代码。你会的。

以上是关于java.util.Calendar.get* 和 java.util.Calendar.set* 被阻塞的主要内容,如果未能解决你的问题,请参考以下文章

第三十一节:扫盲并发和并行同步和异步进程和线程阻塞和非阻塞响应和吞吐等

shell中$()和 ` `${}${!}${#}$[] 和$(()),[ ] 和(( ))和 [[ ]]

Java基础8---面向对象代码块和继承和this和super和重写和重载和final

Java基础8---面向对象代码块和继承和this和super和重写和重载和final

JS中some()和every()和join()和concat()和pop(),push(),shift(),unshfit()和map()和filter()

malloc和free,brk和sbrk和mmap和munmap的使用和关系以及内存分配的原理