4926961: 4/4 TransformerManagementThreadRemoveTests hangs

Changes motivated by Effective Java - Item 48 & Item 51.

Reviewed-by: sspitsyn
This commit is contained in:
Daniel D. Daugherty 2008-03-24 14:39:30 -07:00
parent 41dd8d9f6f
commit bab69115c7
2 changed files with 40 additions and 9 deletions

View file

@ -137,9 +137,16 @@ public class TransformerManagementThreadAddTests extends ATestCaseScaffold
threads[i].start(); threads[i].start();
} }
while (!exec.fDone) // Effective Java - Item 48: Synchronize access to shared mutable data
// Don't use a direct field getter.
while (!exec.isDone())
{ {
Thread.currentThread().yield(); // Effective Java - Item 51: Don't depend on the thread scheduler
// Use sleep() instead of yield().
try {
Thread.sleep(500);
} catch (InterruptedException ie) {
}
} }
assertTrue(finalCheck()); assertTrue(finalCheck());
@ -175,13 +182,17 @@ public class TransformerManagementThreadAddTests extends ATestCaseScaffold
this.fExec = exec; this.fExec = exec;
} }
// Effective Java - Item 48: Synchronize access to shared mutable data
// Document a synchronized setter.
protected synchronized void protected synchronized void
threadFinished(Thread t) threadFinished(Thread t)
{ {
fFinished++; fFinished++;
} }
protected boolean // Effective Java - Item 48: Synchronize access to shared mutable data
// Provide synchronized getter.
protected synchronized boolean
threadsDone() threadsDone()
{ {
return fFinished == TOTAL_THREADS; return fFinished == TOTAL_THREADS;
@ -194,7 +205,9 @@ public class TransformerManagementThreadAddTests extends ATestCaseScaffold
protected boolean protected boolean
testCompleted() testCompleted()
{ {
return getExecThread().fDone; // Effective Java - Item 48: Synchronize access to shared mutable data
// Don't use direct field getter.
return getExecThread().isDone();
} }
/** /**
@ -339,6 +352,18 @@ public class TransformerManagementThreadAddTests extends ATestCaseScaffold
{ {
private boolean fDone = false; private boolean fDone = false;
// Effective Java - Item 48: Synchronize access to shared mutable data
// Provide a synchronized getter.
private synchronized boolean isDone() {
return fDone;
}
// Effective Java - Item 48: Synchronize access to shared mutable data
// Provide a synchronized setter.
private synchronized void setIsDone() {
fDone = true;
}
public void public void
run() run()
{ {
@ -349,7 +374,9 @@ public class TransformerManagementThreadAddTests extends ATestCaseScaffold
// Do a final check for good measure // Do a final check for good measure
executeTransform(); executeTransform();
fDone = true; // Effective Java - Item 48: Synchronize access to shared mutable data
// Don't use direct field setter.
setIsDone();
} }
} }

View file

@ -27,10 +27,9 @@
* @summary multi-thread test to exercise sync and contention for removes to transformer registry * @summary multi-thread test to exercise sync and contention for removes to transformer registry
* @author Gabriel Adauto, Wily Technology * @author Gabriel Adauto, Wily Technology
* *
* @ignore Disabled until race condition which hangs test can be fixed.
* @run build TransformerManagementThreadRemoveTests * @run build TransformerManagementThreadRemoveTests
* @run shell MakeJAR.sh basicAgent * @run shell MakeJAR.sh redefineAgent
* @run main/othervm -javaagent:basicAgent.jar TransformerManagementThreadRemoveTests TransformerManagementThreadRemoveTests * @run main/othervm -javaagent:redefineAgent.jar TransformerManagementThreadRemoveTests TransformerManagementThreadRemoveTests
*/ */
import java.util.*; import java.util.*;
@ -87,7 +86,12 @@ public class TransformerManagementThreadRemoveTests
while (!testCompleted()) while (!testCompleted())
{ {
Thread.currentThread().yield(); // Effective Java - Item 51: Don't depend on the thread scheduler
// Use sleep() instead of yield().
try {
Thread.sleep(500);
} catch (InterruptedException ie) {
}
} }
assertTrue(finalCheck()); assertTrue(finalCheck());