Повторный вход требует, чтобы за каждой блокировкой следовала последующая разблокировка. Например, если я вызову lock.lock()
три раза, ожидается, что я также вызову lock.unlock()
три раза. ReentrantLock
не будет считать себя разблокированным, пока не произойдет эта последовательность событий.
То, что вы не понимаете, это то, что lock.tryLock()
, в случае успеха, будет действовать по сути как вызов lock.lock()
. Таким образом, lock
дважды, вам также нужно unlock
дважды. В вашем примере кода вы разблокируете только один раз, и поэтому поток, который изначально заблокирован, технически владеет блокировкой.
Исправить это должно быть просто, вы можете удалить второй lock.lock()
из вашего кода, и взаимное исключение все еще должно сохраняться. Либо так, либо, если вам нужна блокировка при блокировке, замените lock.tryLock()
на lock.lock()
.
Исходя из ваших правок, вы исправили одну проблему с удалением дополнительной блокировки, но теперь вы столкнулись с проблемой синхронизации. Вам действительно не нужно tryLock
. Вы можете заменить его на lock
, так как вызов lock
приостановит поток и заблокирует, если блокировка уже удерживается (в конечном счете, пробуждается при вызове разблокировки).