मैंने कल कुछ अजीब देखा है। ऐसा लगता है कि दो धागे एक ही समय में एक ही ऑब्जेक्ट पर लॉकिंग दो सिंक्रनाइज़ किए गए ब्लॉक दर्ज कर रहे हैं।सिंक्रनाइज़ अनुभाग ब्लॉक नहीं करता है!
वर्ग (MyClass
) प्रासंगिक कोड युक्त इस जैसा दिखता है:
private static int[] myLock = new int[0];
protected static int methodA(final long handle, final byte[] sort) {
synchronized (myLock) {
return xsMethodA(handle, sort);
}
}
protected static int methodB(final long handle) {
synchronized (myLock) {
return xsMethodB(handle);
}
}
मैं अपने आवेदन ऊपर वर्ग चलाने का एक धागा डंप बनाया और बहुत हैरान था के रूप में मैं इसे देखा:
"http-8080-136" daemon prio=10 tid=0x00000000447df000 nid=0x70ed waiting for monitor entry [0x00007fd862aea000]
java.lang.Thread.State: BLOCKED (on object monitor)
at com.MyClass.methodA(MyClass.java:750)
- locked <0x00007fd8a6b8c790> (a [I)
at com.SomeOtherClass.otherMethod(SomeOtherClass.java:226)
...
"http-8080-111" daemon prio=10 tid=0x00007fd87d1a0000 nid=0x70c8 waiting for monitor entry [0x00007fd86e15f000]
java.lang.Thread.State: BLOCKED (on object monitor)
at com.MyClass.methodB(MyClass.java:991)
- locked <0x00007fd8a6b8c790> (a [I)
at com.SomeOtherClass.yetAnotherMethod(SomeOtherClass.java:3231)
...
(मैं सादगी के मामले के लिए वर्ग और विधि के नाम बदल गया है, तो मूर्खतापूर्ण नाम से उलझन में नहीं मिलता।)
ऐसा नहीं है कि thr लगता है ईएडी http-8080-136 और http-8080-111 दोनों ने myLock
पर लॉक हासिल किया है। यह वही वस्तु है क्योंकि ऑब्जेक्ट पता समान है: 0x00007fd8a6b8c790
। जावा रनटाइम विशिष्टता synchronized
कीवर्ड के बारे में इस का कहना है:
एक सिंक्रनाइज़ बयान को क्रियान्वित धागा की ओर से एक आपसी-बहिष्कार ताला (§17.1) का अधिग्रहण एक ब्लॉक को निष्पादित करता है, तो अवरोध समाप्त। जबकि निष्पादन थ्रेड लॉक का मालिक है, कोई अन्य थ्रेड लॉक प्राप्त कर सकता है। [The Java Language Specification, 14.19]
तो यह कैसे संभव है?
लॉक के लिए थ्रेड डंप "प्रतीक्षा" में एक और 44 धागे हैं। ऐसा लगता है कि धागा इंतजार कर रहा है:
"http-8080-146" daemon prio=10 tid=0x00007fd786dab000 nid=0x184b waiting for monitor entry [0x00007fd8393b6000]
java.lang.Thread.State: BLOCKED (on object monitor)
at com.MyClass.methodC(MyClass.java:750)
- waiting to lock <0x00007fd8a6b8c790> (a [I)
at com.SomeOtherClass.yetAnoterMethod2(SomeOtherClass.java:226)
प्रक्रिया के लिए संकेत QUIT भेज कर। मुझे नहीं पता कि सूर्य वीएम थ्रेड डंप के दौरान कैसे कार्य करता है। लेकिन मुझे लगता है कि प्रक्रिया रुक गई है। अन्यथा आप एक असंगत थ्रेड डंप प्राप्त करेंगे। –
मुझे आईबीएम जेवीएम के लिए पता है यह जरूरी नहीं है, सूर्य के बारे में निश्चित नहीं है, हालांकि, निश्चित रूप से कुछ ध्यान में रखना है। –
यह साइट दावा करती है कि सभी धागे रोक दिए गए हैं: http://expertodev.wordpress.com/2009/05/30/how-to-take-java-thread-dump/ –