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

Там какой-либо путь состоит в том, чтобы проверить, сколько потоков ожидает синхронизированного метода стать разблокированными?

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

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));
    }
}
11
задан Tobias M 13 March 2010 в 23:03
поделиться

3 ответа

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

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
ответ дан 3 December 2019 в 11:20
поделиться

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

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

4
ответ дан 3 December 2019 в 11:20
поделиться

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

Он не дает точно такую ​​статистику, но он говорит вам, как часто возникают конфликты, каково время ожидания и т. Д.

1
ответ дан 3 December 2019 в 11:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: