Я строю систему, в которой ход вызовов потоков зависит от состояния двух переменных. Одна переменная обновляется спорадически внешним источником (отдельно от клиентских потоков) и блоком нескольких клиентских потоков при условии обеих переменных. Система что-то вроде этогоВыполнение всех ожидающих потоков
TypeB waitForB() { // Can be called by many threads.
synchronized (B) {
while (A <= B) { B.wait(); }
A = B;
return B;
{
}
void updateB(TypeB newB) { // Called by one thread.
synchronized (B) {
B.update(newB);
B.notifyAll(); // All blocked threads must receive new B.
}
}
Мне нужно все блокированные потоки, чтобы получить новое значение B, как только она была обновлена. Но проблема в том, что когда один поток заканчивается и обновляет A, условие ожидания снова становится истинным, поэтому некоторые из других потоков блокируются и не получают новое значение B. Существует ли способ гарантировать, что только последний поток, который был заблокирован на B-обновлениях A или другим способом получения такого поведения?
Проверить, что летучее ключевое слово делает в резьбе – Prateek
не кажется, Он будет синхронизировать на 'Ā' @DanielGabriel. – Gray
@ DanielGabriel A = B не изменяет B. –