这是一个僵局吗?它似乎锁定了java.io.PrintStream很多。 它会随机发生,如果你看看。 id为0x67804350的printstream对象被同一个线程同时锁定。
"service-j2ee-247" prio=5 tid=0x00ea34b0 nid=0x13b runnable [1bb2d000..1bb2f678]
at java.nio.CharBuffer.wrap(CharBuffer.java:347)
at sun.nio.cs.StreamEncoder$CharsetSE.implWrite(StreamEncoder.java:378)
at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:136)
- locked <0x67804410> (a java.io.OutputStreamWriter)
at java.io.OutputStreamWriter.write(OutputStreamWriter.java:191)
at java.io.BufferedWriter.flushBuffer(BufferedWriter.java:111)
- locked <0x67804410> (a java.io.OutputStreamWriter)
at java.io.PrintStream.newLine(PrintStream.java:323)
- locked <0x67804350> (a java.io.PrintStream)
at java.io.PrintStream.println(PrintStream.java:586)
- locked <0x67804350> (a java.io.PrintStream)
at org.hibernate.jdbc.AbstractBatcher.log(AbstractBatcher.java:325)
at org.hibernate.jdbc.AbstractBatcher.getPreparedStatement(AbstractBatcher.java:375)
at org.hibernate.jdbc.AbstractBatcher.getPreparedStatement(AbstractBatcher.java:334)
at org.hibernate.jdbc.AbstractBatcher.prepareQueryStatement(AbstractBatcher.java:88)
at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1162)
at org.hibernate.loader.Loader.doQuery(Loader.java:390)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:218)
at org.hibernate.loader.Loader.doList(Loader.java:1593)
at org.hibernate.loader.Loader.list(Loader.java:1577)
at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:395)
at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:271)
答案 0 :(得分:3)
由于synchronized
锁是可重入的,因此这不是死锁。在您的应用程序中某处可能存在死锁,但这不是它。
可重入同步
回想一下,线程无法获取另一个线程拥有的锁。 但是一个线程可以获得它已经拥有的锁。允许一个 线程多次获取相同的锁启用重入 同步。这描述了同步代码的情况, 直接或间接调用也包含的方法 同步代码,两组代码使用相同的锁。没有 可重入同步,同步代码将需要很多 另外的预防措施,以避免线程导致自己阻止。