Các JVM nói với tôi rằng một bế tắc đã xảy ra:"Tìm thấy 1 bế tắc", nhưng dấu vết cho thấy không bị khóa bởi bất kỳ thread
Found one Java-level deadlock:
=============================
"TP-Processor107":
waiting for ownable synchronizer 0x00002aaaf58e70f0, (a java.util.concurrent.locks.ReentrantReadWriteLock$NonfairSync),
which is held by "indexTrackerThread3"
"indexTrackerThread3":
waiting for ownable synchronizer 0x00002aaaf4394580, (a java.util.concurrent.locks.ReentrantReadWriteLock$NonfairSync),
which is held by "TP-Processor16"
"TP-Processor16":
waiting for ownable synchronizer 0x00002aaaf58e70f0, (a java.util.concurrent.locks.ReentrantReadWriteLock$NonfairSync),
which is held by "indexTrackerThread3"
Chúng ta có thể thấy rằng indexTrackerThread3
đang chờ đợi một nguồn lực được tổ chức bởi TP-Processor16
, và ngược -versa. Đó thực sự là một bế tắc.
Chúng ta có thể thấy rằng indexTrackerThread3
đang chờ 0x00002aaaf4394580
:
"indexTrackerThread3":
- parking to wait for <0x00002aaaf4394580>
Câu hỏi của tôi:
Trong the threads dump, tại sao không có dòng - locked <0x00002aaaf4394580>
?
Dường như 0x00002aaaf58e70f0 thực sự không bị khóa bởi bất kỳ chuỗi nào. Điều gì có thể khóa nó?
Trong tất cả tài liệu bế tắc tôi đã đọc (example), cho mỗi dòng - parking to wait for <0x123>
khác nhau, luôn có một dòng - locked <0x123>
. Vì vậy, tôi bắt đầu nghi ngờ một lỗi JVM. Tôi có hiểu nhầm điều gì đó không?
Lưu ý: Xin lỗi vì đã liên kết với pastebin, nhưng câu hỏi không phải là câu trả lời mà không có đổ đầy. Để ngắn gọn, tôi đã xóa tất cả các dòng có chứa "at", chúng không bao gồm bất kỳ thông tin khóa nào.
Cảm ơn bạn đã liên kết! Bây giờ tôi đã làm quen với lớp Unsafe. Ngay cả khi thực hiện thông qua một cuộc gọi đến Unsafe.park, khóa vẫn đến từ một cuộc gọi Java, vậy tại sao phần 'locked <0x123> 'không được viết ở dòng đó? Tôi sẽ đánh giá cao bất kỳ tài liệu nào nói về vấn đề cụ thể của id không có mặt. –