2010-03-13 9 views
10

Czy istnieje sposób sprawdzenia, ile wątków oczekuje na odblokowanie zsynchronizowanej metody?Jak sprawdzić, ile wątków oczekuje na odblokowanie zsynchronizowanej metody?

Chciałbym wiedzieć, kiedy wątek wywołuje zsynchronizowane metody:

1) Ile wątki są już czeka, aby wywołać metodę?

2) Gdy metoda zostanie wywołana, jak długo trzeba czekać na odblokowanie metody?


Rozwiązanie: I rozwiązać to za pomocą układania w stosy odpowiedzieć:

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

'count' nie jest zsynchronizowany, nie uzyskasz dokładnej liczby w sytuacji wielowątkowej. użyj 'AtomicInteger' – irreputable

Odpowiedz

2

Można zmienić swój kod, aby użyć zsynchronizowanego bloku zamiast zsynchronizowanych metod tutaj to mój szorstki projekt. Nie jestem pewien, czy odpowiada drugiemu wymaganiu (ze względu na mój niepewny angielski)

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

Dzięki, użyłem odmiany tego, aby osiągnąć to, co chciałem. –

+1

Hate to -1, ale masz warunki wyścigowe z 'waiting ++;' there ... I widoczność między wątkami również nie jest zapewniona. Może to spowodować niezdeterminowane zachowanie i nie jest dobre. Polecam odpowiedź Brabstera (nie Semafor, ale ten: http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/locks/ReentrantLock.html#getQueueLength%28% 29) –

+0

Nie rozumiem, dlaczego zmienna oczekiwania również nie jest zsynchronizowana? Również oświadczenie czeka ++ bezpieczne? – Rabiees

4

1) Nie wierzę, że to możliwe, aby ten poziom widoczności w kodzie. Java zapewnia więcej powerful concurrency API, co zapewnia znacznie bardziej bezpośrednią kontrolę i widoczność. Jako punkt wyjścia, istnieje semafor klasy, który ma metodę getQueueLength(), która brzmi jak może być to, co chcesz.

2) Po wywołaniu metody zsynchronizowanej, wątek wywołujący będzie czekał aż do odblokowania metody, jak długo to trwa, zależy od tego, jak długo kod z zamkiem ma zrobić coś. Podczas oczekiwania() na obiekt można określić limit czasu. Nie wierzę, że możesz to zrobić za pomocą zsynchronizowanej metody.

+0

+1. Powiedziałbym, że 'ReentrantLock' jest bardziej odpowiedni w tym przypadku niż' Semafor' chociaż. –

1

Myślę, że Java Thread Validator może zapewnić pewien wgląd w te pytania.

Nie daje dokładnie te statystyki, ale ma powiedzieć, jak często zdarza się rywalizacji i co czas oczekiwania jest itp

Powiązane problemy