Поскольку вы ограничены здесь, вот что я бы сделал:
Создайте класс с возможностью сообщить ему, что вы хотите заблокировать его.Существует два типа блокировок: пассивная блокировка и активная блокировка.Пассивная блокировка позволит пропускать неограниченное количество потоков.Активная блокировка сделает его принадлежащим только этому потоку.
Когда вы хотите пассивную блокировку, вы должны зарегистрироваться и отменить регистрацию, когда закончите.Вы будете ждать на внутреннем объекте, пока все активные блокировки не будут выполнены.
Когда вы хотите активную блокировку, вы ждете, пока все текущие пассивные блокировки не будут зарегистрированы.Если в настоящее время есть активная блокировка (сохраните ссылку на поток, чтобы узнать, есть ли она, используя Thread.currentThread()
), тогда дождитесь уведомления.Затем вы можете установить себя в качестве упомянутой темы.Когда вы отменяете регистрацию, если ожидают активные блокировки, сообщите об этом одной из них (рассмотрите Set<Thread>
, чтобы зарегистрировать это).Если нет, сообщите обо всех пассивных блокировках, которые ждут, и они могут пройти.
Здесь будет много вопросов без ответа, и я сомневаюсь, что это идеально, но это большая часть того, что выищем ...