2011-09-02 149 views
12

例如,這是從Tomcat服務器堆棧跟蹤:在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) 

我的猜測是,「鎖定」是指CPU在等待某種類型的鎖。但是,如果是這種情況,爲什麼線程的狀態列爲RUNNABLE而不是BLOCKED?

謝謝。

回答

17

這意味着此線程(RMI TCP Accept-0)擁有哈希碼爲0x911d3c30的對象的所有權,在本例中爲java.net.SocksSocketImpl。當這個線程擁有這個鎖時,其他線程都不能擁有它,阻止它們進入這部分代碼(通常是一個函數)。在這裏看到更多的信息:

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

而且,RUNNABLE,因爲它仍在運行。如果你注意到locked是不是在堆棧的頂部,而是在它裏面,這意味着它持有鎖並繼續執行。這部分代碼的下一個線程將被該鎖阻止。

編輯因爲這太尷尬了,不適合評論...如果你看到這個,你看到一個被阻止的線程。注被說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

謝謝。所以這並不意味着線程閒置或睡着,這正是我所設想的。我在Tomcat服務器中看到了很多這樣的線程。這是正常情況嗎? –

+0

@Frank LaRosa:絕對。在任何時候,我們的服務器上都有10到100個線程。該線程的要點是要等到另一個服務器向它詢問信息時,由於您通常希望能夠一次處理多個請求(例如全文搜索),因此您將擁有多個可用連接器。 –

+0

但是那些線程不僅僅是在循環中使用CPU週期旋轉,而是等待連接,對吧?假設他們不是,是什麼導致他們沒有?通常,當我創建一個工作線程時,它大部分時間都處於WAITING狀態,直到其他線程通知它爲止。在這種情況下,線程全部列爲RUNNABLE。 –

-1

java 6 documentation:在進入該對象上的同步塊或方法時

一個目的監視器被鎖定。

+2

雖然是正確的,但不完全有幫助或描述性。 –

+0

從什麼時候文檔應該是有幫助和描述性的? ;) –

相關問題