Это тупик - смотрите код - PullRequest
       17

Это тупик - смотрите код

1 голос
/ 24 октября 2011

это тупик?похоже, он сильно блокирует java.io.PrintStream.это произойдет очень случайно, если вы посмотрите.объект printstream с идентификатором 0x67804350 был заблокирован одновременно одним потоком.

"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 Ответ

3 голосов
/ 24 октября 2011

Поскольку блокировки synchronized являются вновь входящими, это не тупик. Где-то в вашем приложении может быть тупик, но это не так.

Из руководства по параллелизму :

Входящая синхронизация

Напомним, что поток не может получить блокировку, принадлежащую другому потоку. Но поток может получить блокировку, которой он уже владеет. Разрешение поток, чтобы получить одну и ту же блокировку более одного раза, позволяет повторно войти синхронизации. Это описывает ситуацию, когда синхронизированный код, прямо или косвенно вызывает метод, который также содержит синхронизированный код, и оба набора кода используют одну и ту же блокировку. Без повторяющаяся синхронизация, синхронизированный код должен был бы занять много дополнительные меры предосторожности во избежание блокировки потока.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...