2011-09-02 10 views
12

Ad esempio, questa è una traccia dello stack da un server Tomcat:Che cosa significa "bloccato" in una traccia dello stack Java?

"RMI TCP Accept-0" daemon prio=10 tid=0x091a5800 nid=0x8f1 runnable [0x8b305000] 
    java.lang.Thread.State: RUNNABLE 
    at java.net.PlainSocketImpl.socketAccept(Native Method) 
    at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:408) 
    - locked <0x911d3c30> (a java.net.SocksSocketImpl) 
    at java.net.ServerSocket.implAccept(ServerSocket.java:462) 
    at java.net.ServerSocket.accept(ServerSocket.java:430) 
    at sun.management.jmxremote.LocalRMIServerSocketFactory$1.accept(LocalRMIServerSocketFactory.java:34) 
    at sun.rmi.transport.tcp.TCPTransport$AcceptLoop.executeAcceptLoop(TCPTransport.java:369) 
    at sun.rmi.transport.tcp.TCPTransport$AcceptLoop.run(TCPTransport.java:341) 
    at java.lang.Thread.run(Thread.java:662) 

La mia ipotesi è che "bloccato" significa che la CPU è in attesa su una sorta di una serratura. Tuttavia, se questo è il caso, perché lo stato del thread è elencato come RUNNABLE anziché BLOCKED?

Grazie.

risposta

17

Significa che questo thread (RMI TCP Accept-0) ha la proprietà dell'oggetto con codice hash 0x911d3c30, in questo caso uno java.net.SocksSocketImpl. Mentre questo thread possiede il lock, nessun altro thread può averlo, impedendogli di entrare in questa porzione di codice (spesso una funzione). Vedi qui per maggiori info:

http://download.oracle.com/javase/tutorial/essential/concurrency/newlocks.html

Inoltre, è RUNNABLE perché è ancora in esecuzione ... Se si nota che il locked non è in cima alla pila, ma piuttosto al suo interno, il che significa che tiene il lucchetto e continua l'esecuzione. Il prossimo thread che arriverà da questa sezione di codice verrà bloccato da quel blocco.

EDIT Perché questo è troppo difficile da inserire in un commento ... Se vedi QUESTO, stai vedendo un thread che è bloccato. Nota è dice waiting to lock

"http-80-exec-113": 

at com.airs.utilities.server.Entity.serializeZip64(Entity.java:6314) 
- waiting to lock <0x00007fbefe44d5c8> (a java.lang.String) 
at com.airs.utilities.server.Entity.serializeZip64(Entity.java:6300) 
+0

Grazie. Quindi questo non significa che il thread sia inattivo o addormentato, che è quello che ho assunto. Vedo un sacco di discussioni come questa nel mio server Tomcat. È una condizione normale? –

+0

@Frank LaRosa: Assolutamente. In qualsiasi momento, abbiamo tra 10 e 100 thread in quello stato sui nostri server. L'intero punto di quel thread è di aspettare fino a quando un altro server lo richiede chiedendo informazioni, e dato che di solito si vuole avere la capacità di elaborare più di una richiesta alla volta (ricerche fulltext per esempio), si avranno più connettori disponibili. –

+0

Ma quei thread non si limitano a girare in loop usando i cicli della CPU mentre sono in attesa di una connessione, giusto? Supponendo che non lo sono, che cosa sta causando loro di non farlo? Normalmente quando creo un thread di lavoro, trascorre la maggior parte del suo tempo nello stato di ATTESA, fino a quando qualche altro thread lo notifica. In questo caso, i thread sono tutti elencati come RUNNABLE. –

-1

Da java 6 documentation:

un monitor oggetto è bloccato quando si inserisce un blocco di sincronizzazione o metodo su quell'oggetto.

+2

Mentre vero, non esattamente molto utile o descrittivo. –

+0

Da quando la documentazione doveva essere utile e descrittiva? ;) –