什么是;“锁定”;在Java堆栈跟踪中是什么意思?

什么是;“锁定”;在Java堆栈跟踪中是什么意思?,java,stack,locked,Java,Stack,Locked,例如,这是来自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(PlainSo

例如,这是来自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)
“RMI TCP Accept-0”守护程序prio=10 tid=0x091a5800 nid=0x8f1可运行[0x8b305000]
java.lang.Thread.State:可运行
位于java.net.PlainSocketImpl.socketAccept(本机方法)
在java.net.PlainSocketImpl.accept(PlainSocketImpl.java:408)
-锁定(一个java.net.socksocketimpl)
位于java.net.ServerSocket.implacpt(ServerSocket.java:462)
位于java.net.ServerSocket.accept(ServerSocket.java:430)
位于sun.management.jmxremote.localrmiserverssocketfactory$1.accept(localrmiserverssocketfactory.java:34)
在sun.rmi.transport.tcp.tcptTransport$AcceptLoop.executeAcceptLoop(tcptTransport.java:369)
在sun.rmi.transport.tcp.tcpttransport$AcceptLoop.run(tcpttransport.java:341)中
运行(Thread.java:662)
我的猜测是,“锁定”意味着CPU正在等待某种类型的锁定。但是,如果是这种情况,为什么线程的状态被列为可运行而不是阻塞

谢谢。

这意味着此线程(RMI TCP Accept-0)拥有哈希代码为0x911d3c30的对象的所有权,在本例中为
java.net.socksocketimpl
。虽然这个线程拥有锁,但没有其他线程可以拥有它,从而阻止它们输入这部分代码(通常是函数)。有关更多信息,请参见此处:

此外,它是可运行的,因为它仍在运行。。。如果您注意到
locked
不在堆栈顶部,而是在堆栈内部,这意味着它持有锁并继续执行。这段代码的下一个线程将被该锁阻止

编辑,因为这太尴尬了,无法放入评论中。。。如果您看到这一点,您将看到一个被阻塞的线程。注意:上面写着等待锁定的

"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)
“http-80-exec-113”:
位于com.airs.utilities.server.Entity.serializeZip64(Entity.java:6314)
-等待锁定(java.lang.String)
位于com.airs.utilities.server.Entity.serializeZip64(Entity.java:6300)
来自:

在对象上输入同步块或方法时,对象监视器被锁定


谢谢所以这并不意味着线程处于空闲或休眠状态,这是我所假设的。我在我的Tomcat服务器上看到了很多这样的线程。“这是正常情况吗?”弗兰克·拉洛萨:当然。在任何时候,我们的服务器上都有10到100个线程处于这种状态。该线程的全部要点是等待另一个服务器刺探它以请求信息,并且由于您通常希望能够一次处理多个请求(例如全文搜索),您将有多个可用的连接器。但是这些线程在等待连接时并不仅仅使用CPU周期在循环中旋转,对吗?假设他们不是,是什么导致他们不这么做?通常,当我创建工作线程时,它的大部分时间都处于等待状态,直到其他线程通知它。在这种情况下,,这些线程都被列为可运行的。@Frank LaRosa:我相信Java中套接字线程的工作方式是,它们处于某种中间状态——它们基本上处于睡眠状态,当有东西连接到它们时会被唤醒……但从技术上讲,它们不是睡眠的:)我经常看到“等待”,然后在跟踪中看到“等待”“锁定”,这是什么意思?线程有一个锁,它正在等待它创建的锁?这听起来像是一个死锁吗?虽然是真的,但并不是很有帮助或描述性的。从什么时候开始,文档应该是有帮助和描述性的?;)