Почему моя пользовательская реализация ClassLoader вызывает тупик между потоками?JAVA

Программисты JAVA общаются здесь
Anonymous
Почему моя пользовательская реализация ClassLoader вызывает тупик между потоками?

Сообщение Anonymous »

У меня есть класс Loader Loaderx, который наследует от urlclassloader . Этот загрузчик класса реализует следующие методы: < /p>

Код: Выделить всё

override fun loadClass(name: String, resolve: Boolean): Class {
try {
return super.loadClass(name, resolve)
} catch (_: ClassNotFoundException) { }
return pluginClassLoaderManager.loadClass(name, this)
}

override fun loadClassNoParent(name: String): Class {
val lock = getClassLoadingLock(name)
synchronized(lock) {
return findLoadedClass(name) ?: findClass(name)
}
}
Здесь, PluginclassloarderManager - это менеджер загрузчиков класса, который управляет всеми загрузчиками класса в программе. Вызов его нагрузочного класса Метод делегирует операцию загрузки в метод LoadClassNoparent других загрузчиков класса. Программа, я считаю, что эта логика может привести к тупику: < /p>

Код: Выделить всё

"DefaultDispatcher-worker-3@2727" tid=0x24 nid=NA waiting for monitor entry
java.lang.Thread.State: BLOCKED
Blocked by DefaultDispatcher-worker-2@2726
Waiting for DefaultDispatcher-worker-2@2726 to release lock  (x.PluginUrlClassLoader)
at x.PluginUrlClassLoader.loadClassNoParent(PluginUrlClassLoader.kt:82)
at x.PluginClassLoaderManager.loadClass(PluginClassLoaderManager.kt:73)
at x.PluginUrlClassLoader.loadClass(PluginUrlClassLoader.kt:76)
at java.lang.ClassLoader.loadClass(ClassLoader.java:526)

"DefaultDispatcher-worker-2@2726" tid=0x23 nid=NA waiting for monitor entry
java.lang.Thread.State: BLOCKED
Blocked by DefaultDispatcher-worker-3@2727
Waiting for DefaultDispatcher-worker-3@2727 to release lock  (x.PluginUrlClassLoader)
at x.PluginUrlClassLoader.loadClassNoParent(PluginUrlClassLoader.kt:82)
at xr.PluginClassLoaderManager.loadClass(PluginClassLoaderManager.kt:73)
at x.PluginUrlClassLoader.loadClass(PluginUrlClassLoader.kt:76)
at java.lang.ClassLoader.loadClass(ClassLoader.java:526)
< /code>
Две потоки ждут друг друга, чтобы выпустить замки, но я не могу выяснить, при каких обстоятельствах возникнет этот конфликт. По логике, как только поток получает блокировку 
, он должен выполнить свою собственную логику findclass , а затем вернуть класс (или бросить исключение). Зачем в конечном итоге два потока ожидают замков друг друга?


Подробнее здесь: https://stackoverflow.com/questions/795 ... en-threads

Вернуться в «JAVA»