提交 906a8055 编写于 作者: J jbachorik

8034168: ThreadMXBean/Locks.java failed, blocked on wrong object

Reviewed-by: martin, dholmes
上级 ac729b08
......@@ -170,6 +170,9 @@ public class Locks {
private static CheckerThread checker;
static class WaitingThread extends Thread {
private final Phaser p;
volatile boolean waiting = false;
public WaitingThread(Phaser p) {
super("WaitingThread");
this.p = p;
......@@ -180,7 +183,9 @@ public class Locks {
log("WaitingThread about to wait on objC");
try {
// Signal checker thread, about to wait on objC.
waiting = false;
p.arriveAndAwaitAdvance(); // Phase 1 (waiting)
waiting = true;
objC.wait();
} catch (InterruptedException e) {
e.printStackTrace();
......@@ -199,7 +204,9 @@ public class Locks {
synchronized(objC) {
try {
// signal checker thread, about to wait on objC
waiting = false;
p.arriveAndAwaitAdvance(); // Phase 3 (waiting)
waiting = true;
objC.wait();
} catch (InterruptedException e) {
e.printStackTrace();
......@@ -208,25 +215,35 @@ public class Locks {
}
log("WaitingThread about to exit waiting on objC 2");
}
}
static class CheckerThread extends Thread {
private final Phaser p;
public CheckerThread(Phaser p) {
super("CheckerThread");
this.p = p;
public void waitForWaiting() {
p.arriveAndAwaitAdvance();
while (!waiting) {
goSleep(10);
}
waitForState(State.WAITING);
}
private void waitForState(Thread.State state) {
public void waitForBlocked() {
p.arriveAndAwaitAdvance();
waitForState(State.BLOCKED);
}
private void waitForState(Thread.State state) {
while (!waiter.isInterrupted() && waiter.getState() != state) {
goSleep(10);
Thread.yield();
}
}
}
static class CheckerThread extends Thread {
public CheckerThread() {
super("CheckerThread");
}
public void run() {
synchronized (ready) {
// wait until WaitingThread about to wait for objC
waitForState(Thread.State.WAITING); // Phase 1 (waiting)
waiter.waitForWaiting(); // Phase 1 (waiting)
checkBlockedObject(waiter, objC, null, Thread.State.WAITING);
synchronized (objC) {
......@@ -235,13 +252,13 @@ public class Locks {
// wait for waiter thread to about to enter
// synchronized object ready.
waitForState(Thread.State.BLOCKED); // Phase 2 (waiting)
waiter.waitForBlocked(); // Phase 2 (waiting)
checkBlockedObject(waiter, ready, this, Thread.State.BLOCKED);
}
// wait for signal from waiting thread that it is about
// wait for objC.
waitForState(Thread.State.WAITING); // Phase 3 (waiting)
waiter.waitForWaiting(); // Phase 3 (waiting)
synchronized(objC) {
checkBlockedObject(waiter, objC, Thread.currentThread(), Thread.State.WAITING);
objC.notify();
......@@ -289,7 +306,7 @@ public class Locks {
waiter = new WaitingThread(p);
waiter.start();
checker = new CheckerThread(p);
checker = new CheckerThread();
checker.start();
try {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册