Как проверить, сколько потоков ожидает разблокировки синхронизированного метода - PullRequest
11 голосов
/ 14 марта 2010

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

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

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

Ответы [ 3 ]

4 голосов
/ 14 марта 2010

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

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

2 голосов
/ 14 марта 2010

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

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 голос
/ 14 марта 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...