2011-09-02 32 views
12

Ví dụ, đây là một stack trace từ một máy chủ Tomcat:"Khóa" có nghĩa là gì trong một dấu vết ngăn xếp 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) 

tôi đoán là "khóa" có nghĩa là CPU đang chờ đợi vào một số loại khóa. Tuy nhiên, nếu đó là trường hợp, tại sao trạng thái của luồng được liệt kê là RUNNABLE thay vì BLOCKED?

Cảm ơn.

Trả lời

17

Điều đó có nghĩa là chuỗi này (RMI TCP Accept-0) có quyền sở hữu đối tượng có mã băm 0x911d3c30, trong trường hợp này là java.net.SocksSocketImpl. Trong khi chủ đề này sở hữu khóa, không có chủ đề nào khác có thể có, chặn chúng nhập phần mã này (thường là một hàm). Xem ở đây để biết thêm:

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

Ngoài ra, nó là Runnable bởi vì nó vẫn đang chạy ... Nếu bạn nhận thấy rằng locked không phải là ở phía trên cùng của ngăn xếp nhưng thay vì bên trong nó, đó có nghĩa là nó giữ khóa và tiếp tục thực hiện. Chuỗi tiếp theo sẽ đến bởi phần mã này sẽ bị khóa bởi khóa đó.

EDIT Bởi vì điều này quá khó xử để phù hợp với nhận xét ... Nếu bạn thấy THIS, bạn đang thấy một chuỗi bị chặn. Lưu ý là nói 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

Cảm ơn. Vì vậy, điều này không có nghĩa là luồng không hoạt động hoặc đang ngủ, đó là những gì tôi đã giả định. Tôi thấy rất nhiều chủ đề như thế này trong máy chủ Tomcat của tôi. Đó có phải là tình trạng bình thường không? –

+0

@Frank LaRosa: Tuyệt đối. Tại bất kỳ thời điểm nào, chúng tôi có từ 10 đến 100 luồng trong trạng thái đó trên các máy chủ của chúng tôi. Toàn bộ điểm của chuỗi đó là đợi cho đến khi một máy chủ khác yêu cầu thông tin và vì bạn thường muốn có khả năng xử lý nhiều yêu cầu cùng một lúc (ví dụ tìm kiếm toàn văn), bạn sẽ có nhiều trình kết nối có sẵn. –

+0

Nhưng những chủ đề đó không chỉ quay vòng lặp bằng cách sử dụng các chu kỳ CPU trong khi chúng đang chờ kết nối, đúng không? Giả sử họ không phải là, những gì khiến họ không? Thông thường khi tôi tạo một chuỗi công nhân, nó dành phần lớn thời gian của nó trong trạng thái WAITING, cho đến khi một số luồng khác thông báo cho nó. Trong trường hợp này, các luồng được liệt kê là RUNNABLE. –

-1

Từ java 6 documentation:

Một màn hình đối tượng bị khóa khi nhập một khối đồng bộ hóa hoặc phương pháp trên đối tượng đó.

+2

Trong khi thực sự, không chính xác rất hữu ích hoặc mô tả. –

+0

Vì khi nào tài liệu được cho là hữu ích và mang tính mô tả? ;) –

Các vấn đề liên quan