On 2/27/14 4:29 AM, Paul Sandoz wrote:
This will allocate about 10 Thread objects per second until the other thread
finally reaches the synchronized read() method in BufferedInputStream...
>
I like it.
I like it too.
I do have a slight preference for Mandy's solution, see below, but i am not
sure we can guarantee it is supported on all test platforms.
The hotspot VM implementation supports it on all platforms. Note that
this cost is not small - it stops the world and up call to JVM.
Mandy
Paul.
try {
while (!isMonitorLockHeld(monitor)) {
Thread.sleep(1);
}
} catch (UnsupportedOperationException e) {
// Back up plan?
Thread.sleep(TimeUnit.SECONDS.toMillis(1));
}
/**
* Returns {@code true} if and only if the a thread holds the
* monitor lock on the specified object.
*
* @throws java.lang.UnsupportedOperationException if monitoring of
* object monitor use is not supported
*/
public static boolean isMonitorLockHeld(Object o) {
int oihc = System.identityHashCode(o);
ThreadMXBean tmxbean = ManagementFactory.getThreadMXBean();
ThreadInfo[] tinfos = tmxbean.dumpAllThreads(true, false);
for (ThreadInfo ti : tinfos) {
for (MonitorInfo mi : ti.getLockedMonitors()) {
if (mi.getIdentityHashCode() == oihc)
return true;
}
}
return false;
}