Java 如何检查有多少线程正在等待同步方法解锁

Java 如何检查有多少线程正在等待同步方法解锁,java,multithreading,synchronization,Java,Multithreading,Synchronization,有没有办法检查有多少线程在等待同步方法解锁 我想知道线程何时调用同步方法: 1) 有多少线程正在等待调用该方法 2) 调用该方法后,需要等待多长时间才能解锁该方法 解决方案: 我用堆垛机解决了这个问题,回答: public class LockedClass { public static int count; public static void measuringClass() throws IOException{ long startTime = Sys

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

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

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<String, String> params = new Hashtable<String, String>();
        params.put("param1", "test");
        params.put("param2", "12345678");
        String sessionId = Common.getSession(Common.executeHttpRequest(params));
    }
}
公共类锁定类{
公共静态整数计数;
公共静态void measuringClass()引发IOException{
long startTime=System.currentTimeMillis();
计数++;
System.out.println(“线程等待=“+count”);
锁定方法(起始时间);
计数--;
System.out.println(“线程等待=“+count”);
}
公共静态同步的void lockedMethod(long startTime)引发IOException{
System.out.println(“队列中的I-spend=“+(System.currentTimeMillis()-startTime)+”);
Hashtable params=新的Hashtable();
参数put(“参数1”、“测试”);
参数put(“参数2”、“12345678”);
字符串sessionId=Common.getSession(Common.executehtprequest(params));
}
}
1)我认为您的代码不可能具有这种级别的可见性。Java提供了一种更为直接的控制和可视性。作为起点,有一个类信号量,它有一个方法,听起来可能是您想要的

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

我想这可能会为这些问题提供一些见解


它没有给出确切的统计数据,但它确实告诉您争用发生的频率以及等待时间等。

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


谢谢,我使用了它的一个变体来实现我不喜欢的-1,但是你有一个
waiting++的竞赛条件那里。。。而且线程间的可见性也无法保证。这可能会导致不确定的行为,是不好的。我推荐Brabster的答案(虽然不是信号量,但这一个:),我不明白为什么等待变量也不同步?语句waiting++安全吗?
count
未同步,在多线程情况下无法获得准确的计数。使用原子整数。我想说,在这种情况下,
ReentrantLock
信号量
更合适。
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));
        }
    }
}