#java #synchronized
#java #синхронизированный
Вопрос:
Я использую стороннюю библиотеку, в которой есть статический синхронизированный метод, я хочу выполнить этот метод параллельно, не изменяя его исходный код.
Что я могу сделать?
Должен ли я создать службу-исполнитель с фабрикой потоков, которая устанавливает новый загрузчик контекстного класса?
Спасибо
Ответ №1:
Статический синхронизированный метод означает, что он заблокирован в классе. только один поток может захватить блокировку класса. Вы даже не можете создать подкласс этого класса, поскольку это не позволит вам переопределить статический метод.
Боюсь, вы ничего не сможете сделать.
Ответ №2:
Конечно, теоретически вы могли бы загрузить библиотеку дважды в отдельных загрузчиках классов. Практика может быть более сложной.
Для того, чтобы связать ссылку с копией в разных загрузчиках классов, вам также потребуется загрузить свой код несколько раз в этих загрузчиках классов (или в загрузчике дочернего класса). Общая связь между экземплярами кода должна осуществляться через код, загруженный в общий базовый класс. Сведите отражение к абсолютному минимуму. Классы, загружаемые разными загрузчиками классов, будут несовместимы, даже если у них одинаковые имена, которые обычно проявляются как причудливые ClassCastException
s. Например, объект среды выполнения и тип приведения имеют одно и то же имя. Следующее? Вы уверены, что хотите это сделать?
Вероятно, есть причина, по которой метод синхронизирован. Вероятно, причина действительно плохая. Там будет изменяемая статика. Поскольку вы загружали код более одного раза, будет несколько копий этих изменяемых статических данных. Если это просто кеши, это может быть не так уж плохо. Однако библиотека почти наверняка действительно отстой.
ПРИМЕЧАНИЕ: Загрузчик класса контекста потока имеет очень мало общего с чем-либо, кроме как портить ситуацию.
Ответ №3:
Если вы хотите выполнить этот метод параллельно, вам придется выполнить его в другом процессе, то есть запустить вашу программу дважды параллельно.
Ответ №4:
Если вы загружаете класс в двух разных загрузчиках классов, вы можете запускать методы в каждом загрузчике классов независимо. Однако я подозреваю, что у автора класса была веская причина для создания метода static synchronized
Я бы проверил, что это на самом деле не требуется.