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;
     }


Reply via email to