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

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

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