Там какой-либо путь состоит в том, чтобы проверить, сколько потоков ожидает синхронизированного метода стать разблокированными?
Я хотел бы знать, когда поток называет синхронизированный метод:
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));
}
}
Вы можете преобразовать свой код, чтобы использовать синхронизированный блок вместо синхронизированных методов, вот мой черновик. Я не уверен, соответствует ли это вашему второму требованию (из-за моего изменчивого английского)
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 параллелизма , который обеспечивает гораздо более прямой контроль и прозрачность. В качестве отправной точки есть класс Semaphore, у которого есть метод getQueueLength () , который звучит так, как будто это может быть то, что вы хотите.
2) Когда вызывается синхронизированный метод, вызывающий поток будет ждать, пока метод не будет разблокирован; сколько времени это займет, зависит от того, сколько времени потребуется коду с блокировкой, чтобы выполнить свое действие. При wait () для объекта вы можете указать тайм-аут. Я не верю, что вы можете сделать это с помощью синхронизированного метода.
Я думаю, что Java Thread Validator может дать некоторое представление об этих вопросах.
Он не дает точно такую статистику, но он говорит вам, как часто возникают конфликты, каково время ожидания и т. Д.