Относительно многопоточных загрузчиков пользовательских классов в Java SE 7 - PullRequest
0 голосов
/ 06 января 2012

Привет: я был озадачен добавлением многопоточных загрузчиков классов (SE7).

Существует превосходное объяснение возможной тупиковой ситуации во время загрузки многопоточных классов, которая приведена здесь http://docs.oracle.com/javase/7/docs/technotes/guides/lang/cl-mt.html.... Однако я никогда не сталкивался с этой ошибкой и написал несколько многопоточных приложений, которые реализуют много наследования.

Мне только что повезло? Или это была НАСТОЯЩАЯ проблема. Если последнее, то

Может ли кто-нибудь предоставить мне реальный (неабстрактный) способ воспроизвести эту ошибку в простом приложении?

В конечном счете, мой самый фундаментальный вопрос здесь заключается в том, является ли тупик загрузчика классов JDK просто угловым гейзеном низкого уровня уровня , который на самом деле не вызывает много проблем, или это действительно серьезное добавление функции в JDK?

Ответы [ 2 ]

0 голосов
/ 18 июля 2012

Похоже, это относительно серьезная проблема для ограниченного числа приложений, использующих пользовательский многопоточный загрузчик классов.Трудно сказать, если это проблема, не зная, над чем вы работаете.Однако, если вы видели блокирующее поведение, они предложили способы избежать его.

  1. Убедитесь, что ваш пользовательский загрузчик классов является многопоточным безопасным для одновременной загрузки классов.

    Выберите решениесхема внутренней блокировки.Например, java.lang.ClassLoader использует схему блокировки на основе запрошенного имени класса.

    Удалите всю синхронизацию только с помощью блокировки объекта загрузчика классов.

    Убедитесь, что критические секции безопасны для несколькихпотоки, загружающие разные классы.

  2. В статическом инициализаторе загрузчика классов вызовите статический метод java.lang.ClassLoader registerAsParallelCapable ().Эта регистрация означает, что все экземпляры вашего пользовательского загрузчика классов являются многопоточными безопасными.

  3. Убедитесь, что все классы загрузчика классов, которые расширяет этот пользовательский загрузчик классов, также вызывают метод registerAsParallelCapable () в своих инициализаторах классов,Убедитесь, что они являются многопоточными безопасными для одновременной загрузки классов.

Они также добавляют: Если ваш пользовательский загрузчик классов переопределяет только findClass (String), вам не нужны дальнейшие изменения.Это рекомендуемый механизм для создания пользовательского загрузчика классов.

0 голосов
/ 06 января 2012

Эта статья относится к пользовательским написанным многопоточным загрузчикам классов, а не просто к многопоточным приложениям. Если вы не пишете или не используете многопоточный загрузчик пользовательских классов, похоже, что проблема не повлияет на вас.

Если вы используете многопоточный загрузчик пользовательских классов, то, по-видимому, он не заблокируется, если правильно написано в JDK 7.

...