Выполнить статический синхронизированный метод параллельно - PullRequest
3 голосов
/ 10 ноября 2011

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

Что я могу сделать?

Следуетсоздать службу исполнителя с фабрикой потоков, которая устанавливает новый загрузчик классов контекста?

Спасибо

Ответы [ 4 ]

3 голосов
/ 10 ноября 2011

Статический синхронизированный метод означает, что он заблокирован в классе. только один поток может захватить блокировку класса. Вы не можете даже создать подкласс этого класса, так как он не позволит вам переопределить статический метод.

Боюсь, вы ничего не можете сделать.

2 голосов
/ 10 ноября 2011

Теоретически можно дважды загрузить библиотеку в отдельных загрузчиках классов. Практика может быть более сложной.

Чтобы связать ссылку на копию в разных загрузчиках классов, вам также необходимо несколько раз загрузить код в эти загрузчики классов (или загрузчик дочерних классов). Общее взаимодействие между экземплярами кода должно проходить через код, загруженный в общий базовый класс. Держите отражение до абсолютного минимума . Классы, загруженные различными загрузчиками классов, будут несовместимы, даже если они имеют одинаковые имена, что обычно проявляется как причудливые ClassCastException s. Например, объект времени выполнения и тип приведения имеют одно и то же имя. Следующий? Вы уверены, что хотите это сделать?

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

NB: Загрузчик класса контекста потока имеет очень мало общего с чем-либо, кроме как испортить вещи.

2 голосов
/ 10 ноября 2011

Если вы хотите выполнить этот метод параллельно, вам придется выполнять его в другом процессе - т.е. запустить вашу программу дважды параллельно.

1 голос
/ 10 ноября 2011

Если вы загружаете класс в двух разных загрузчиках классов, вы можете запускать методы в каждом загрузчике классов независимо.Тем не менее, я подозреваю, что у автора класса была веская причина сделать метод static synchronized Я бы проверил, что это на самом деле не требуется.

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