Ich habe eine einfache Klasse geschrieben, die AbstractQueuedSynchronizer verwendet. Ich habe eine Klasse geschrieben, die ein "Tor" darstellt, das übergeben werden kann, wenn es offen ist, oder es blockiert, wenn es geschlossen wird. Hier ist der Code:AbstractQueuedSynchronizer.acquireShared wartet unendlich, auch wenn sich die Wartebedingung geändert hat
public class GateBlocking {
final class Sync extends AbstractQueuedSynchronizer {
public Sync() {
setState(0);
}
@Override
protected int tryAcquireShared(int ignored) {
return getState() == 1 ? 1 : -1;
}
public void reset(int newState) {
setState(newState);
}
};
private Sync sync = new Sync();
public void open() {
sync.reset(1);
}
public void close() {
sync.reset(0);
}
public void pass() throws InterruptedException {
sync.acquireShared(1);
}
};
Leider, wenn ein Thread-Blöcke auf Pass Methode, weil Tor geschlossen ist und ein anderer Thread öffnet das Tor in Zwischenzeit die blockierte man nicht unterbrochen bekommt - Es blockiert unendlich. Hier ist ein Test, es zeigt:
public class GateBlockingTest {
@Test
public void parallelPassClosedAndOpenGate() throws Exception{
final GateBlocking g = new GateBlocking();
Thread t = new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(2000);
g.open();
} catch (InterruptedException e) {
}
}
});
t.start();
g.pass();
}
}
Bitte helfen Sie, was soll ich das Tor Gang Thread die Sperre erfolgreich erwerben machen ändern.
Ihre Implementierung ist sehr ähnlich zu BooleanLatch, sofern in AbstractQueuedSynchronizer Java-Doc mit in
protected try*()
Methoden definieren, ich nehme an, Sie müssen synchron nennen. releaseShared (1) wenn du Tore öffnest – hoaz