java - jstack线程转储是否一致?

标签 java multithreading synchronized jstack

我从 jstack 获得了线程转储。 它显示两个线程锁定在同一个对象上 locked <0x00000000c0313ce0> 。 当 jstack 显示第一个线程的堆栈跟踪而不是在同一时刻显示第二个线程的堆栈跟踪时,是否有可能出现这种情况? 或者还有什么原因会导致这种锁定情况?

"Thread-1" #44 prio=5 os_prio=0 tid=0x000000001c418800 nid=0x922c in Object.wait() [0x0000000018ffe000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    at org.h2.mvstore.db.MVTable.doLock1(MVTable.java:242)
    at org.h2.mvstore.db.MVTable.lock(MVTable.java:167)
    - locked <0x00000000c0313ce0> (a org.h2.engine.Database)
    at org.h2.engine.Database.lockMeta(Database.java:896)
    at org.h2.engine.Database.removeMeta(Database.java:919)
    - locked <0x00000000c0313ce0> (a org.h2.engine.Database)
    at org.h2.table.Table.removeChildrenAndResources(Table.java:525)
    at org.h2.mvstore.db.MVTable.removeChildrenAndResources(MVTable.java:799)
    at org.h2.engine.Session.cleanTempTables(Session.java:830)
    - locked <0x00000000c0313ce0> (a org.h2.engine.Database)
    at org.h2.engine.Session.close(Session.java:708)
    at org.h2.engine.Database.closeAllSessionsException(Database.java:1186)
    - locked <0x00000000c0313ce0> (a org.h2.engine.Database)
    at org.h2.engine.Database.close(Database.java:1224)
    - locked <0x00000000c0313ce0> (a org.h2.engine.Database)
    at org.h2.engine.DatabaseCloser.run(DatabaseCloser.java:63)

"Resource Destroyer in BasicResourcePool.close()" #110 daemon prio=5 os_prio=0 tid=0x000000001c41a000 nid=0x2d44 in Object.wait() [0x000000001b6ae000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    at org.h2.mvstore.db.MVTable.doLock1(MVTable.java:242)
    at org.h2.mvstore.db.MVTable.lock(MVTable.java:167)
    - locked <0x00000000c0313ce0> (a org.h2.engine.Database)
    at org.h2.engine.Database.lockMeta(Database.java:896)
    at org.h2.engine.Database.removeMeta(Database.java:919)
    - locked <0x00000000c0313ce0> (a org.h2.engine.Database)
    at org.h2.table.Table.removeChildrenAndResources(Table.java:525)
    at org.h2.mvstore.db.MVTable.removeChildrenAndResources(MVTable.java:799)
    at org.h2.engine.Session.cleanTempTables(Session.java:830)
    - locked <0x00000000c0313ce0> (a org.h2.engine.Database)
    at org.h2.engine.Session.close(Session.java:708)
    at org.h2.jdbc.JdbcConnection.close(JdbcConnection.java:383)
    - locked <0x00000000ede38ce0> (a org.h2.engine.Session)
    - locked <0x00000000ede37708> (a org.h2.jdbc.JdbcConnection)
    at com.mchange.v2.c3p0.impl.NewPooledConnection.close(NewPooledConnection.java:642)
    at com.mchange.v2.c3p0.impl.NewPooledConnection.closeMaybeCheckedOut(NewPooledConnection.java:255)
    - locked <0x00000000ee186430> (a com.mchange.v2.c3p0.impl.NewPooledConnection)
    at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.destroyResource(C3P0PooledConnectionPool.java:621)
    - locked <0x00000000ee186490> (a java.lang.Object)
    at com.mchange.v2.resourcepool.BasicResourcePool$1DestroyResourceTask.run(BasicResourcePool.java:1065)
    at com.mchange.v2.resourcepool.BasicResourcePool.destroyResource(BasicResourcePool.java:1090)
    at com.mchange.v2.resourcepool.BasicResourcePool.destroyResource(BasicResourcePool.java:1051)
    at com.mchange.v2.resourcepool.BasicResourcePool.access$100(BasicResourcePool.java:44)
    at com.mchange.v2.resourcepool.BasicResourcePool$5.run(BasicResourcePool.java:1305)

最佳答案

这两个线程没有锁定对象:它们都在对同一对象 oo.wait() 调用中等待。

请记住,o.wait() 首先释放对象 o 上的锁。然后它等待其他线程通知该对象,然后在返回调用者之前重新获取锁。

关于java - jstack线程转储是否一致?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34858035/

相关文章:

java - 在 Java 中从 Google Talk 检索离线消息和聊天历史记录

android - std::thread 在 android JNI 中导致 SIGABRT

java - 我需要使 Singleton 类中的每个方法同步吗?

java - 如何避免由于代码重复而导致的过载?

java - 使用正则表达式显示字母以外的字符

java - byte array[] to byte 在java中有可能吗?

java - 递增线程名称

c++ - std::async 指定线程的模拟

java - 如果我在同一个类上同步了两个方法,它们可以同时运行吗?

java - "synchronized"方法与 "synchronized (Class.class)"