Mercurial > hg > openjdk > jdk8u > jdk
changeset 11428:78def9711bfe
8034168: ThreadMXBean/Locks.java failed, blocked on wrong object
Reviewed-by: martin, dholmes
author | jbachorik |
---|---|
date | Fri, 12 Feb 2016 17:52:29 +0300 |
parents | 84ed5919d06f |
children | e2117e30fb39 |
files | test/java/lang/management/ThreadMXBean/Locks.java |
diffstat | 1 files changed, 29 insertions(+), 12 deletions(-) [+] |
line wrap: on
line diff
--- a/test/java/lang/management/ThreadMXBean/Locks.java Thu Feb 11 00:47:07 2016 -0800 +++ b/test/java/lang/management/ThreadMXBean/Locks.java Fri Feb 12 17:52:29 2016 +0300 @@ -170,6 +170,9 @@ 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 @@ 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 @@ 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 @@ } 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); + } + + public void waitForBlocked() { + p.arriveAndAwaitAdvance(); + waitForState(State.BLOCKED); } private void waitForState(Thread.State state) { - p.arriveAndAwaitAdvance(); 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 @@ // 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 @@ waiter = new WaitingThread(p); waiter.start(); - checker = new CheckerThread(p); + checker = new CheckerThread(); checker.start(); try {