powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / нереальный дедлок :)
5 сообщений из 5, страница 1 из 1
нереальный дедлок :)
    #39434963
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть кастомный Classloader, соответственно метод loadClass synchronized внутри него пишется что-то в лог. Далее при определенных обстоятельствах ловится дедлок, а именно:

Первый в это время в синхронайзед блоке создает класс (в синхронайзед секции) и пытается залоггировать - ждет пока второй освободит лок (внутренний логгера - log4j).

Второй поток зашел в секцию log.debug(...) получил внутренний лок логгера (тот который ждет первый поток)
и дошел до:
Код: java
1.
2.
3.
 public String  toString() {
         return getClass().getName()+": "+getMessage(); (1)
     }


ЗДЕСЬ ОН ПОЧЕМУ ТО ЖДЕТ RELEASE НА ЛОК КЛАССЛОАДЕРА! Как вообще это возможно?
Как на строке (1) вообще какие-либо локи/мониторы могут захватываться?
...
Рейтинг: 0 / 0
нереальный дедлок :)
    #39434990
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
no56892соответственно метод loadClass synchronized
Не понял откуда тут "соответственно"?

no56892ЗДЕСЬ ОН ПОЧЕМУ ТО ЖДЕТ RELEASE НА ЛОК КЛАССЛОАДЕРА! Как вообще это возможно?
Как на строке (1) вообще какие-либо локи/мониторы могут захватываться?
Возможно там нарисовался новый класс и заблокировалось выполнение потому как заблокирована загрузка классов?
Хотелось бы, конечно, дамп потоков посмотреть.
...
Рейтинг: 0 / 0
нереальный дедлок :)
    #39435000
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
"tPool-0@26413" daemon prio=5 tid=0x87c6 nid=NA waiting for monitor entry
  java.lang.Thread.State: BLOCKED
	 ...Дофига ждущих
	 waiting for pool-386-thread-8@26460 to release lock on <0x68d2> (a CustomClassLoader) !!!!!!! //КААААК?
	  at com.ctc.wstx.exc.WstxException.toString(WstxException.java:88)
	  at java.lang.String.valueOf(String.java:2826)
	  at java.io.PrintWriter.println(PrintWriter.java:710)
	  at java.lang.Throwable.printStackTrace(Throwable.java:509)
	  - locked <0x68cf> (a java.io.PrintWriter)
	  at org.apache.log4j.DefaultThrowableRenderer.render(DefaultThrowableRenderer.java:60)
	  at org.apache.log4j.spi.ThrowableInformation.getThrowableStrRep(ThrowableInformation.java:87)
	  - locked <0x68d0> (a org.apache.log4j.spi.ThrowableInformation)
	  at org.apache.log4j.spi.LoggingEvent.getThrowableStrRep(LoggingEvent.java:413)
	  at org.apache.log4j.WriterAppender.subAppend(WriterAppender.java:313)
	  at org.apache.log4j.RollingFileAppender.subAppend(RollingFileAppender.java:276)
	  at org.apache.log4j.WriterAppender.append(WriterAppender.java:162)
	  at org.apache.log4j.AppenderSkeleton.doAppend(AppenderSkeleton.java:251)
	  - locked <0x68d1> (a org.apache.log4j.RollingFileAppender)
	  at org.apache.log4j.helpers.AppenderAttachableImpl.appendLoopOnAppenders(AppenderAttachableImpl.java:66)
	  at org.apache.log4j.Category.callAppenders(Category.java:206)
	  - locked <0x680f> (a org.apache.log4j.spi.RootLogger)                    !!!!!!!!!!!!!!!!!! внутренний лок логгера
	  at org.apache.log4j.Category.forcedLog(Category.java:391)
	  at org.apache.log4j.Category.error(Category.java:322)
	...


"pool-386-thread-8@26460" prio=5 tid=0x261 nid=NA waiting for monitor entry
  java.lang.Thread.State: BLOCKED
	 blocks tPool-0@26413
	 waiting for transitionPool-0@26413 to release lock on <0x680f> (a org.apache.log4j.spi.RootLogger) !!!!!!!!!!!!! внутренний лок логгера
	  at org.apache.log4j.Category.callAppenders(Category.java:204)
	  at org.apache.log4j.Category.forcedLog(Category.java:391)
	  at org.apache.log4j.Category.debug(Category.java:260)
	  at CustomClassLoader.loadClass(CustomClassLoader.java:298)
	  - locked <0x68d2> (a CustomClassLoader) 			!!!!!!!!!!!!!!!! // static synchronized loadClass
	  at java.lang.ClassLoader.loadClass(ClassLoader.java:247)  
	  at java.lang.Class.forName0(Class.java:-1)
	  at java.lang.Class.forName(Class.java:247)
          ....



Код com.ctc.wstx.exc.WstxException.toString
http://grepcode.com/file/repo1.maven.org/maven2/org.codehaus.woodstox/wstx-asl/3.2.7/com/ctc/wstx/exc/WstxException.java#WstxException
...
Рейтинг: 0 / 0
нереальный дедлок :)
    #39435013
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,
Хм, я так понял, в указанном коде:
Код: java
1.
2.
3.
 public String  toString() {
         return getClass().getName()+": "+getMessage(); (1)
     }


только в случае если в методе getMessage() будут создаваться объекты и соответственно будет деадлок, логично, че :o). А я Х часов искал связь с локом класслоадера и строкой getClass().getName().
...
Рейтинг: 0 / 0
нереальный дедлок :)
    #39435014
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / нереальный дедлок :)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]