2016-09-21 5 views
-1

Нельзя разрешать нить за раз, но только один конкретный поток.Java: Есть ли способ сделать один класс (библиотеки) доступным только для одного конкретного потока?

Это не класс, к которому у меня есть доступ (ну, на самом деле, я бы хотел избежать создания вилки), или я мог бы использовать this, несмотря на то, что я думаю, что, возможно, что jRat, вероятно, можно использовать для автоматического подхода к таким классам, мы Не хочу развиваться.

Итак, есть основной() поток, где все начинается, я хочу, чтобы все методы и поле всех объектов определенного класса были изменены другими потоками, путем исключения исключения/сбоя, если это произойдет. Такие объекты должны оставаться неизмененными (это значения полей), пока основной поток работает с ним.

Как вы это сделаете? если это действительно возможно.

+1

Вы можете посмотреть 'Thread.currentThread()' в своем методе и решить, хотите ли вы продолжить или нет (на основе имени потока или идентификатора объекта для ранее захваченного потока). – Thilo

+2

Но это звучит как проблема A-B. Чего вам действительно нужно достичь? – Thilo

+1

Например, почему бы не просто убедиться, что ни один другой поток не получает ссылку на объект (но только неизменяемую или ограниченную оболочку)? – Thilo

ответ

1

Если вы пытаетесь достичь этого для каких-то целей отладки/тестирования, я предлагаю следующее.

В Java используется AOP для перехвата (путем записи перехватчика) всех вызовов, выполняемых в общедоступные/частные функции класса библиотеки (примеры Spring - http://howtodoinjava.com/spring/spring-aop/writing-spring-aop-aspectj-pointcut-expressions-with-examples). В классе перехватчиков поддерживайте информацию о потоке (TID), обращаясь к перехваченным методам. Теперь, когда ваш перехватчик вызывается до и после функции библиотеки, если поток вызывает библиотечную функцию, а другой поток выполняет библиотечную функцию, вы можете выбрать исключение.

Например -

1) можно сохранить атомное целое «TID» в классе перехватчика, который устанавливается в 0 на начальном этапе, а когда поток вызывает функцию библиотеки получает контроль перехватчик перед библиотечная функция называется , 2) На этом этапе попробуйте сравнить и установить переменную «tid». 3) После того, как функция библиотеки выполняется, снова установите значение 0.

Вы можете бросить исключение, если сравнивать и набор терпит неудачу в шаге 2.

Это решение будет иметь некоторые ограничения в зависимости от объекта перехвачены.

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

+0

Прохладный, я думал об этом. Но вы сказали, что это в основном полезно в среде разработки? Интересно, что релиз может быть, мы не должны его использовать? Кроме того, считаете ли вы, что пользовательский загрузчик классов может делать то же самое, но в среде выпуска? И, кстати, несмотря на то, что я не хочу поддерживать вилку, я просто подумал, что это может быть скрипт patcher (например, в bash + sed), который обновляет все методы одного класса, чтобы проверить, что соответствующий поток также может быть слишком сложным (Я думаю, что пользовательский загрузчик классов мог бы сделать то же самое?). –

+0

Решение, которое я предложил, действительно является взломом, если вы посмотрите на него, поэтому я упомянул о предостережении. Также могут быть ограничения на использование АОП. Я не полностью понимаю объем вашей проблемы, но, на мой взгляд, чтобы изменить поведение любого класса библиотеки, лучше написать обертку вокруг нее, которая изменяет поведение класса библиотеки в чистом виде. Обслуживание также проще. Украшение класса в качестве подходящего является широко используемым и принятым подходом. Надеюсь это поможет. – Pranav