2011-10-24 10 views
1

これはデッドロックですか? 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

[タグ:solaris]とは何が関係していますか? –

+0

solarisはosです – grassbl8d

答えて

3

​​ロックが再入されているので、これはデッドロックではありません。アプリケーションのどこかにデッドロックがあるかもしれませんが、これはそうではありません。 concurrency tutorialから

リエントラント同期

スレッドが別のスレッドが所有しているロックを取得できないことを思い出してください。 しかし、スレッドはすでに所有しているロックを取得できます。 スレッドが同じロックを2回以上取得できるようにすると、再入可能な 同期が有効になります。これは、同期コード が直接的または間接的に 同期コードを含むメソッドを呼び出し、両方のコードセットが同じロックを使用する状況を示します。 リエントラント同期がない場合、同期コードは、スレッドが自身をブロックするのを避けるために、多くの 追加の予防措置を取らなければなりません。

+0

こんにちは、ここにはコードの一部があります。プライベートvoidログ(String SQL){ SQL_LOG.debug(sql);if(this.factory.getSettings()。isShowSqlEnabled())System.out.println( "Hibernate:" + sql); }他のロックをチェックした後、ほとんどのロックはその特定のjava.io.PrintStream – grassbl8d

関連する問題