簡體   English   中英

“鎖定”在Java堆棧跟蹤中意味着什么?

[英]What does “locked” mean in a Java stack trace?

例如,這是來自Tomcat服務器的堆棧跟蹤:

    "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?

謝謝。

這意味着該線程(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)

java 6文檔

在該對象上輸入同步塊或方法時,將鎖定對象監視器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM