- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
在 Java 线程转储中,我发现了以下内容:
"TP-Processor184" daemon prio=10 tid=0x00007f2a7c056800 nid=0x47e7 waiting for monitor entry [0x00007f2a21278000]
java.lang.Thread.State: BLOCKED (on object monitor)
at org.apache.jackrabbit.core.state.SharedItemStateManager.getNonVirtualItemState(SharedItemStateManager.java:1725)
- locked <0x0000000682f99d98> (a org.apache.jackrabbit.core.state.SharedItemStateManager)
at org.apache.jackrabbit.core.state.SharedItemStateManager.getItemState(SharedItemStateManager.java:257)
"TP-Processor137" daemon prio=10 tid=0x00007f2a7c00f800 nid=0x4131 waiting for monitor entry [0x00007f2a1ace7000]
java.lang.Thread.State: BLOCKED (on object monitor)
at org.apache.jackrabbit.core.state.SharedItemStateManager.getNonVirtualItemState(SharedItemStateManager.java:1725)
- locked <0x0000000682f99d98> (a org.apache.jackrabbit.core.state.SharedItemStateManager)
at org.apache.jackrabbit.core.state.SharedItemStateManager.getItemState(SharedItemStateManager.java:257)
这里的要点是两个线程都锁定了监视器<0x0000000682f99d98>(不管它们现在在等待两个不同的其他监视器)。
当查看线程转储分析器时,选择了该监视器,它确实在底部显示“线程锁定监视器:2”和“2 个线程锁定”。请看https://lh4.googleusercontent.com/-fCmlnohVqE0/T1D5lcPerZI/AAAAAAAAD2c/vAHcDiGOoMo/s971/locked_by_two_threads_3.png对于屏幕截图,我不允许在此处粘贴图片。
这是否意味着线程转储在监视器锁定信息方面不是原子的?我无法想象这真的是 JVM (1.6.0_26-b03) 的锁定错误。
Can several threads hold a lock on the same monitor in Java? 中已经提出了类似的问题,但对我的回答没有看到多个线程锁定同一个监视器的真正意义,即使它们可能正在等待其他监视器。
2014 年 5 月 13 日更新:
较新的问题 Multiple threads hold the same lock?有重现该行为的代码,@rsxg 已提交相应的错误报告 https://bugs.openjdk.java.net/browse/JDK-8036823按照他在这里的回答。
最佳答案
我不认为您的线程转储是说您的两个线程正在“等待两个不同的其他监视器”。我认为这是在说他们都在同一台监视器上等待,但在两个不同的代码点。这可能是堆栈位置或对象实例位置或其他东西。这是一份关于 analyzing the stack dumps 的很棒的文档.
Can several threads hold a lock on the same monitor in Java?
没有。您的堆栈转储显示两个线程锁定在同一监视器上的同一代码位置但在不同的堆栈帧中——或者任何看起来取决于操作系统的值。
编辑:
我不确定为什么线程转储似乎在说两个线程都锁定了一行,因为这似乎只有在它们处于 wait()
方法中时才允许。我注意到您正在链接到 1.6.5 版。那真的是您使用的版本吗?在版本 2.3.6(可能是最新的)中,1725 line实际上是一个wait
。
1722 synchronized (this) {
1723 while (currentlyLoading.contains(id)) {
1724 try {
1725 wait();
1726 } catch (InterruptedException e) {
即使它是独占 同步
锁,您也可以看到这种堆栈跟踪。例如,Linux 下的以下堆栈转储是针对来自同一代码行但在 Runnable.run()
方法的两个不同实例中锁定在同一对象上的两个线程。这是我的 stupid little test program .请注意,监视器条目编号不同,即使是相同的锁和相同的代码行号。
"Thread-1" prio=10 tid=0x00002aab34055c00 nid=0x4874
waiting for monitor entry [0x0000000041017000..0x0000000041017d90]
java.lang.Thread.State: BLOCKED (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x00002aab072a1318> (a java.lang.Object)
at com.mprew.be.service.auto.freecause.Foo$OurRunnable.run(Foo.java:38)
- locked <0x00002aab072a1318> (a java.lang.Object)
at java.lang.Thread.run(Thread.java:619)
"Thread-0" prio=10 tid=0x00002aab34054c00 nid=0x4873
waiting for monitor entry [0x0000000040f16000..0x0000000040f16d10]
java.lang.Thread.State: BLOCKED (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x00002aab072a1318> (a java.lang.Object)
at com.mprew.be.service.auto.freecause.Foo$OurRunnable.run(Foo.java:38)
- locked <0x00002aab072a1318> (a java.lang.Object)
at java.lang.Thread.run(Thread.java:619)
在我的 Mac 上,格式不同,但对于相同的行号,“监视器条目”后的数字也不相同。
"Thread-2" prio=5 tid=7f8b9c00d000 nid=0x109622000
waiting for monitor entry [109621000]
java.lang.Thread.State: BLOCKED (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <7f3192fb0> (a java.lang.Object)
at com.mprew.be.service.auto.freecause.Foo$OurRunnable.run(Foo.java:38)
- locked <7f3192fb0> (a java.lang.Object)
"Thread-1" prio=5 tid=7f8b9f80d800 nid=0x10951f000
waiting for monitor entry [10951e000]
java.lang.Thread.State: BLOCKED (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <7f3192fb0> (a java.lang.Object)
at com.mprew.be.service.auto.freecause.Foo$OurRunnable.run(Foo.java:38)
- locked <7f3192fb0> (a java.lang.Object)
This Oracle document将该值描述如下:
Address range, which gives an estimate of the valid stack region for the thread
关于java - 多个 Java 线程看似锁定同一个监视器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9536975/
以下是否意味着只有一个线程可以在对象的任何方法中?或者多个线程可以使用不同的方法而不是同一个方法吗?为什么? public class SynchronizedCounter { privat
我有一个 java 监视器,但我需要一些解释: class Test { private int data; private boolean full = false; public sy
#include #include #include #include #define N_ASS 4 pthread_t tid[N_ASS]; //mutex pthread_mutex_
我想知道是否有一种工具可以跟踪我的 C# 程序正在使用/访问的文件列表(文本/任何外部文件)? =D 有什么工具吗? 附注它是为了测试程序安全性.. ;) 最佳答案 ProcessMonitor监控任
我想知道 Monitor 类。据我所知,所有等待线程都不是 FIFO。第一个获得锁的并不总是等待队列中的第一个。这样对吗?有什么方法可以确保 FIFO 条件? 问候 最佳答案 如果您指的是内置方式,则
我有一个 ASP.net (c#) 应用程序,其中包含修改全局可访问资源(如 web.config 文件)的部分代码。当然,在修改资源时,为了防止竞争条件,一次只允许一个用户,因此我需要使用监视器锁定
如何方便调试持久化上下文的状态、观察查询结果、监控所有实体? 有一些 JPA 监视器可以用于此吗? 最佳答案 如果您使用 EclipseLink,则有一个性能监视器选项, 看, http://wiki
启动和停止按钮在监视器 tomcat 中被禁用,大约 10-15 分钟后,它允许我重新启动服务器 当 tomcat 停止响应并且我尝试重新启动服务器时,我遇到了这个问题,我能够停止服务器,但之后它不允
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
我必须开发一个系统来监控报告的生成/传输。 系统数据将存储在数据库表中(Sybase) 报告将按不同的时间表生成(“周一至周五晚上 10 点”、“周六早上 5 点”、“每月的第一天”等) 系统只会监控
我需要同步多个线程(使用 POSIX 线程)。此外,我正在使用条件变量(监视器)来实现这一点。 问题是我必须实现“先到先得”的策略。假设多个线程正在等待另一个线程发出条件变化的信号,pthread_c
在 eclipse 中,我有一个运行的 weblogic 服务器,并部署了一个 j2ee 应用程序。该应用程序在端口 7001 上提供服务。我想将监视器连接到应用程序,我不知道要使用什么端口。我想我知
我正在使用芹菜和花卉。当我访问Flower中的“任务”标签时,我可以看到我的任务正在注册,甚至可以在“状态”列中看到“成功”标签以及所有内容。 但是,在“监视器”选项卡上,所有图形(“成功任务”,“失
有人知道有一个可以监控 beanstalkd 队列的应用程序吗?我正在寻找一些可以显示管道和工作统计信息并允许您检查详细信息的东西。 我对语言/平台并不是很挑剔,只是想在编写自己的语言/平台之前知道是
使用 Microsoft.Azure.Management.Monitor 的预览包,我尝试将指标从 Azure 获取到 .NET Core 应用程序中,但我不确定要输入什么内容作为“resource
使用 Microsoft.Azure.Management.Monitor 的预览包,我尝试将指标从 Azure 获取到 .NET Core 应用程序中,但我不确定要输入什么内容作为“resource
我想知道是否有一种方法可以通过客户端应用程序连接到位于 WebLogic 服务器上的业务 Activity 监视器。我想用 BAM 语句替换 JMS 生产者/消费者客户端中的日志语句,以便使用消息进度
我的网站有一个DIV,它的高度不固定。当用户在图像上移动鼠标时,将出现此 DIV 并显示有关图像的一些信息。页面上有几个网格格式的图像,每个图像都有自己的信息。很明显,一些图像位于屏幕底部,因此通过
提醒:Arch Linux 使用 pacman 而不是 apt-get 所以我有一个想法,我希望能够离开我的房间,并且仍然可以看到我手机的下载进度。我曾寻找过已有的程序,但一无所获,所以我决定自己编写
如果连接到多个显示器,如何使用 python 制作屏幕截图? 我试过: import sys from PyQt4.QtGui import QPixmap, QApplication app = Q
我是一名优秀的程序员,十分优秀!