如何检查等待同步方法解锁的线程数

有没有办法检查有多少线程在等待同步方法解锁?

我想知道线程何时调用synchronized方法:

1)已经有多少线程在等待调用该方法?

2)一旦调用该方法需要等待该方法解锁多长时间?


解决方案:我使用堆垛机解决了这个问题:

public class LockedClass { public static int count; public static void measuringClass() throws IOException{ long startTime = System.currentTimeMillis(); count++; System.out.println("Threads waiting="+count); lockedMethod(startTime); count--; System.out.println("Threads waiting="+count); } public static synchronized void lockedMethod(long startTime) throws IOException{ System.out.println("I spent="+(System.currentTimeMillis()-startTime)+" in the queue"); Hashtable params = new Hashtable(); params.put("param1", "test"); params.put("param2", "12345678"); String sessionId = Common.getSession(Common.executeHttpRequest(params)); } } 

您可以将代码转换为使用synchronized块而不是synchronized方法,这是我的草稿。 我不确定它是否符合你的第二个要求(由于我的英语不稳定)

 public class Sync { public static int waiting = 0; private Object mutex = new Object(); public void sync() { waiting++; synchronized (mutex) { waiting--; long start = System.currentTimeMillis(); doWhatever(); System.out.println("duration:" + (System.currentTimeMillis() - start)); } } } 

1)我不相信你的代码可以具备这种级别的可见性。 Java提供了更强大的并发API ,可提供更直接的控制和可见性。 作为一个起点,有一个类信号量,它有一个方法getQueueLength()听起来可能是你想要的。

2)当调用synchronized方法时,调用线程将一直等到方法解锁,需要多长时间取决于带锁的代码执行其操作所需的时间。 当wait() – 在对象上时,您可以指定超时。 我不相信你可以用同步方法做到这一点。

我认为Java Thread Validator可能会对这些问题提供一些见解。

它没有准确地给出那些统计数据,但它确实告诉你争用发生的频率和等待时间等等。