У меня есть метод getNewA(), который должен блокироваться до тех пор, пока какой-либо другой поток не вызовет setA (x). Правильно ли использовать CountDownLatch? Я заметил, что есть гонка данных, в которой есть вероятность, что после того, как gate.await() разблокирует другой поток, вызовет setA (x), используя старую защелку, поэтому можно было бы пропустить значение. Я думал о синхронизации getNewA(), но разве это не привело бы к тупиковой ситуации? Любые предложения о том, как подойти к этому?CountDownLatch Synchronization
package test;
import java.util.concurrent.CountDownLatch;
public class A {
private int a;
private CountDownLatch gate;
public A(int a) {
a = 1;
gate = new CountDownLatch(1);
}
A getNewA() throws InterruptedException { // wait for new a...
gate.await();
gate = new CountDownLatch(1);
return this;
}
public synchronized int getA() {
return a;
}
public synchronized void setA(int a) {
gate.countDown();
this.a = a;
}
}
Если другой поток вызывает 'setA' * перед *' getNewA() ', что это значит? Может ли семафор быть более полезным для вас? –
Если setA находится перед getNewA(). Поток, который вызывает getNewA(), вернет экземпляр без блокировки – xxtommoxx
И если 'setA()' вызывается дважды до вызова 'getNewA()', что же происходит? Могут ли два вызова 'getNewA()' проходить без блокировки? Если два потока ожидают 'getNewA()', и приходит один вызов 'setA()', должны ли они быть разблокированы или только один? Вам действительно нужно подробно описать вашу ситуацию :) –