Вы можете использовать Semahore
:
package test;
import java.util.concurrent.Semaphore;
public class A {
private int a
private Semaphore semaphore = new Semaphore(0);
public A(int a) {
a = 1;
}
A getNewA() throws InterruptedException { // wait for new a...
semaphore.acquire();
return this;
}
public synchronized int getA() {
return percent;
}
public synchronized void setA(int a) {
this.a = a;
semaphore.release();
}
}
Если у семафора осталось 0 разрешений и два потока вызывают getA
один за другим, оба будут блокироваться, и только один из них будет недетерминированно выбран для пробуждения при вызове setA
.
Если setA
вызывается дважды в последовательности, это позволит двум потокам вызвать getA
в следующий раз, что может быть не так, как вы хотите, так как они оба получат одинаковую ссылку на this
.