Мне интересно, есть ли простой способ сделать блокировку , которая будет реагировать на изменение ссылок. У меня есть код, который выглядит примерно так:Повторная проверка измененной ссылки для «синхронизированной» блокировки?
private void fus(){
synchronized(someRef){
someRef.roh();
}
}
...
private void dah(){
someRef = someOtherRef;
}
То, что я хотел бы случиться:
- Поток А входит
fus
, и получает блокировку наsomeref
, как он называетroh()
. Предположим, чтоroh
никогда не заканчивается. - Резьба B вводит
fus
, начинает ждать, пока некоторый Ref` будет свободным и останется там (на данный момент). - Резьба C вводится
dah
и изменяетsomeRef
. - В настоящее время разрешено вводить поток В, в который введено значение
someRef
. Объект Thread имеет блокировку.
Что происходит на самом деле:
- Поток А входит
fus
, и получает блокировку наsomeref
, как он называетroh()
. Предположим, чтоroh
никогда не заканчивается. - Резьба B вводит
fus
, находит замок и ожидает его освобождения (навсегда). - Резьба C вводится
dah
и изменяетsomeRef
. - Thread B продолжает ждать, так как это уже не глядя на
someref
, он смотрит на замке, принадлежащего А.
Есть ли способ, чтобы установить это такую, что тему B будет либо повторно проверить блокировка для изменения ссылок или «отскакивание» в другой код? (что-то вроде sychronizedOrElse?)
Похоже, что вы синхронизируете не тот объект. – user2357112
Это любопытство или вы ищете решение? – UDKOX
@UDOX - немного каждого.В моем коде достаточно краев, что это не вызывает большой озабоченности (если метод, эквивалентный «roh», не может завершиться, это, вероятно, проблема сама по себе, что мои блокировки испортились, это не настоящий преступник), но было бы хорошо знать, и, похоже, было бы полезно избегать взаимоблокировок. –