RFR 8030847: java/lang/management/ThreadMXBean/ThreadBlockedCount.java fails intermittently again

Jaroslav Bachorik jaroslav.bachorik at oracle.com
Mon Dec 23 04:42:36 PST 2013


Please, review the following test fix:

Issue : https://bugs.openjdk.java.net/browse/JDK-8030847
Webrev: http://cr.openjdk.java.net/~jbachorik/8030847/webrev.00/

The root cause of the intermittent failures of this test is the fact 
that there is a lot of hidden places in JDK classes when the checked 
thread can get BLOCKED - and it will distort the blocked count and the 
test will fail. The ones identified in this case were:

- ThreadMXBean.getThreadInfo()
- System.out.println()
- Phaser.arriveAndAwaitAdvance()

Whether the thread gets blocked or not depends on many variables and 
this makes the failure very intermittent.

The fix consists of:
- not using ThreadMXBean.getThreadInfo() from within the tested thread
- not using System.out.println() (or any other kind of output) in the 
tested thread
- not using Phaser to synchronize the tested thread and the control thread

The toughest part is to replace Phaser for the synchronization purposes 
with a similar construct which would not block the thread when waiting 
for the other party. CyclicBarrier didn't work either as probably 
wouldn't not any other solution based on java.util.concurrent locks.

The TwoPartySynchronizer provides the block-free synchronization and is 
based on atomics and Thread.wait(). It is not a general purpose 
replacement for Phaser or CyclicBarrier but it works very well for 
exactly two parties needing progress synchronization and not wanting to 
block any of the parties.

Thanks,

-JB-


More information about the serviceability-dev mailing list