2010-11-13 34 views
6

Thông thường khi tôi yêu cầu kết xuất chuỗi, các triệu chứng của hệ thống hoạt động kém có thể được giải thích một cách dễ dàng; tức là tôi sẽ có thể thấy rằng một số chủ đề rõ ràng đang chờ đợi trên một màn hình đã được mua lại nhưng không được phát hành bởi người khác.Các luồng Java đang chờ khóa đối tượng không bị khóa (hiển nhiên) bị khóa

Trong trường hợp này, tôi có rất nhiều chủ đề đang đợi màn hình (0x965ad100), nhưng không có chủ đề nào có màn hình đó ngay từ đầu. Các chủ đề trong câu hỏi có thể được xác định với chữ ký này:

chờ đợi để khóa < 0x965ad100> (a uk.gov.dti.og.fox.ConAgent)

Tôi đã thử Googling này, và tất cả những gì tôi có thể tìm thấy là các bài đăng thảo luận về các màn hình bị khóa, không có gì về việc chờ một màn hình không bị khóa.

Chủ đề bãi đầy đủ: http://www.basson.at/docs/stackoverflow/thread_dump.txt

Tôi hy vọng ai đó ở đây có thể giải thích những gì tôi nhìn thấy, hoặc ít nhất là chỉ cho tôi đi đúng hướng. Cảm ơn trước vì bất kỳ phản hồi nào.

+0

BTW, bạn tốt hơn kiểm tra những gì là Thread-9 làm, bởi vì nó chờ đợi cho các khóa cùng nó đã được mua lại (0x96560c48) –

Trả lời

1

Có thể (mặc dù không chắc) rằng một chuỗi chỉ phát hành màn hình khi kết xuất chuỗi của bạn được thực hiện. Có thể có một khoảng thời gian ngắn giữa khi một màn hình được phát hành và luồng tiếp theo sẽ nhận được nó. Nếu bạn không ở trong một bế tắc thực sự, điều này có thể giải thích những gì bạn đang nhìn thấy. Hãy thử một kết xuất chuỗi khác và kiểm tra một chuỗi.

Nhiều khả năng, có một chuỗi trong đó ở đâu đó đã giữ màn hình. Đôi khi nó không phải là hiển nhiên. Dấu vết ngăn xếp của bạn có một số dòng "bị khóa" liệt kê các chuỗi giữ một số khóa nhất định, nhưng danh sách đó không nhất thiết phải hoàn thành. Ví dụ, tôi nghi ngờ ổ khóa thu được thông qua JNI không được liệt kê.

Nếu bạn có thể thay thế khóa được cài sẵn, ví dụ: java.util.concurrent.locks.ReentrantLock, sau đó bạn có thể tạm ngưng chương trình và đính kèm trình gỡ lỗi, tìm khóa bạn quan tâm và tìm chủ sở hữu khóa bằng cách sử dụng phương thức getOwner.

1

Nếu bạn đang sử dụng Eclipse, bạn có thể sử dụng trình xem khóa được tích hợp sẵn thông qua chế độ xem Gỡ lỗi có thể hữu ích. Bạn có thể kích hoạt nó bằng cách sử dụng trình đơn thả xuống truy cập thông qua mũi tên chỉ xuống trên thanh công cụ :)

alt text

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