Подтвердить что ты не робот

Что означает "заблокировано" в трассировке стека Java?

Например, это трассировка стека с сервера 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)

Я предполагаю, что "заблокировано" означает, что процессор ждет какой-то блокировки. Однако, если это так, почему состояние потока указано как RUNNABLE, а не BLOCKED?

Спасибо.

4b9b3361

Ответ 1

Это означает, что этот поток (RMI TCP Accept-0) имеет право собственности на объект с хеш-кодом 0x911d3c30, в данном случае a java.net.SocksSocketImpl. Хотя этот поток владеет блокировкой, ни один другой поток не может иметь его, блокируя их от ввода этой части кода (часто это функция). См. Здесь для получения дополнительной информации:

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

Кроме того, он является RUNNABLE, потому что он все еще запущен... Если вы заметили, что locked находится не в верхней части стека, а скорее внутри него, это означает, что он удерживает блокировку и продолжает выполнение. Следующий поток для этого раздела кода будет заблокирован этой блокировкой.

EDIT. Потому что это слишком неудобно, чтобы вписаться в комментарий... Если вы видите ЭТО, вы видите поток, который заблокирован. Примечание: 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)

Ответ 2

Из документация java 6:

Монитор объектов блокируется при вводе блока или метода синхронизации на этом объекте.