Как проверить, сколько потоков ожидает синхронного метода для разблокировки

Есть ли способ проверить, сколько потоков ожидает синхронного метода для разблокировки?

Я хотел бы знать, когда поток вызывает синхронизированный метод:

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

Ответ 1

Вы можете преобразовать свой код, чтобы использовать синхронизированный блок вместо синхронизированных методов, вот мой примерный черновик. Я не уверен, соответствует ли это вам второе требование (из-за моего изменчивого английского)

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

Ответ 2

1) Я не считаю возможным наличие такого уровня видимости в вашем коде. Java предоставляет более мощный concurrency API, который обеспечивает гораздо более прямой контроль и видимость. В качестве отправной точки существует класс Семафор, который имеет метод getQueueLength(), который звучит так, как будто это может быть то, что вы хотите.

2) Когда вызывается синхронный метод, вызывающий поток будет ждать, пока метод будет разблокирован, как долго это займет, зависит от того, как долго код с блокировкой принимает свою задачу. Когда wait() на объекте, вы можете указать тайм-аут. Я не думаю, что вы можете сделать это с помощью синхронизированного метода.

Ответ 3

Я думаю, Java Thread Validator может дать некоторое представление об этих вопросах.

Это не дает точно такую ​​статистику, но это говорит вам, как часто происходит конфликт, и какое время ожидания и т.д.