这是一个僵局 - 请参阅代码

时间:2011-10-24 15:24:12

标签: hibernate log4j solaris deadlock

这是一个僵局吗?它似乎锁定了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)

1 个答案:

答案 0 :(得分:3)

由于synchronized锁是可重入的,因此这不是死锁。在您的应用程序中某处可能存在死锁,但这不是它。

来自concurrency tutorial

  

可重入同步

     

回想一下,线程无法获取另一个线程拥有的锁。   但是一个线程可以获得它已经拥有的锁。允许一个   线程多次获取相同的锁启用重入   同步。这描述了同步代码的情况,   直接或间接调用也包含的方法   同步代码,两组代码使用相同的锁。没有   可重入同步,同步代码将需要很多   另外的预防措施,以避免线程导致自己阻止。