एक जावा threaddump मैं निम्नलिखित पाया में:एकाधिक जावा धागे प्रतीत होता है कि एक ही मॉनिटर लॉकिंग?
"TP-Processor184" daemon prio=10 tid=0x00007f2a7c056800 nid=0x47e7 waiting for monitor entry [0x00007f2a21278000]
java.lang.Thread.State: BLOCKED (on object monitor)
at org.apache.jackrabbit.core.state.SharedItemStateManager.getNonVirtualItemState(SharedItemStateManager.java:1725)
- locked <0x0000000682f99d98> (a org.apache.jackrabbit.core.state.SharedItemStateManager)
at org.apache.jackrabbit.core.state.SharedItemStateManager.getItemState(SharedItemStateManager.java:257)
"TP-Processor137" daemon prio=10 tid=0x00007f2a7c00f800 nid=0x4131 waiting for monitor entry [0x00007f2a1ace7000]
java.lang.Thread.State: BLOCKED (on object monitor)
at org.apache.jackrabbit.core.state.SharedItemStateManager.getNonVirtualItemState(SharedItemStateManager.java:1725)
- locked <0x0000000682f99d98> (a org.apache.jackrabbit.core.state.SharedItemStateManager)
at org.apache.jackrabbit.core.state.SharedItemStateManager.getItemState(SharedItemStateManager.java:257)
यहां मुद्दा यह जा रहा है कि दोनों धागे की निगरानी < 0x0000000682f99d98> लॉक कर दिया है (उनमें से भले ही अब दो अलग अलग अन्य पर नज़र रखता है के लिए इंतज़ार कर)।
थ्रेड डंप विश्लेषक को देखते समय, उस मॉनिटर के चयन के साथ, यह वास्तव में "थ्रेड लॉक मॉनिटर: 2" नीचे, और "2 थ्रेड लॉकिंग" कहता है। स्क्रीनशॉट के लिए कृपया https://lh4.googleusercontent.com/-fCmlnohVqE0/T1D5lcPerZI/AAAAAAAAD2c/vAHcDiGOoMo/s971/locked_by_two_threads_3.png देखें, मुझे यहां छवियों को पेस्ट करने की अनुमति नहीं है।
क्या इसका मतलब है कि थ्रेडडंप मॉनीटर लॉक जानकारी के संबंध में परमाणु नहीं हैं? मैं कल्पना नहीं कर सकता कि यह वास्तव में JVM (1.6.0_26-b03) की लॉकिंग बग है।
Can several threads hold a lock on the same monitor in Java? में एक समान प्रश्न पूछा जा चुका है, लेकिन मेरे जवाब में एक ही मॉनीटर को लॉक करने वाले कई धागे के वास्तविक बिंदु को नहीं देखा गया, भले ही वे किसी अन्य के लिए इंतजार कर रहे हों।
अद्यतन मई 13 वीं 2014:
नया सवाल Multiple threads hold the same lock? व्यवहार पुन: पेश करने कोड है, और @rsxg उसके जवाब की तर्ज यहाँ के साथ एक बग रिपोर्ट अनुसार https://bugs.openjdk.java.net/browse/JDK-8036823 दायर किया है।
मेरे उत्तर दोस्त पर कोई प्रतिक्रिया? मैंने इसे इंगित करने के लिए संपादित किया कि कोड के बाद के संस्करणों में लाइन 1725 पर 'प्रतीक्षा() 'है। कृपया स्वीकार करें कि यह सही है या नहीं। – Gray
हम जैकबैबिट संस्करण 1.6.5 का उपयोग कर रहे हैं। मेरे एक दोस्त ने यह भी देखा कि संस्करण 2.3.6 में एक ही पंक्ति संख्या पर 'प्रतीक्षा करें), क्योंकि यह आश्चर्यजनक रूप से मेल खाता है, लेकिन दुर्भाग्य से यह गलत स्रोत कोड है ... – jfrantzius