जब आपके पास किसी ऑब्जेक्ट (0) obj
पर synchronized
ब्लॉक हैं तो जावा कैसे जांचता है कि ये सभी obj
एस समान या अलग हैं या नहीं?जावा ताले: सिंक्रनाइज़ ब्लॉक में मॉनिटर ताले के लिए समानता जांच कैसे की जाती है?
public static f() {
synchronized ("xyz") {
...
}
}
ऊपर समारोह f
दो धागे से एक साथ कहा जाता है कि वे अन्य को अवरुद्ध कर देगा:
? ध्यान दें कि प्रत्येक थ्रेड को String
ऑब्जेक्ट का नया उदाहरण मिलेगा।
यह जांचने के लिए मैंने निम्नलिखित परीक्षण कोड लिखा है, और ऐसा लगता है कि उपरोक्त ब्लॉक काम करेगा, लेकिन फिर अन्य अप्रत्याशित परिणाम भी हैं।
public class Test {
public static void main(String[] args){
new Thread() {
public void run() {
//f1("A", new X());
f1("A", "Str");
}
}.start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//f1("B", new X());
f1("B", "Str");
}
public static void f1(String a, Object x) {
synchronized(x) {
System.out.println("f1: " + a);
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("f1: " + a + " DONE");
}
}
private static class X {
public boolean equals(Object o) {
System.out.println("equals called");
return true;
}
public int hashCode() {
System.out.println("hashCode called");
return 0;
}
}
}
आप उपरोक्त कोड आप मिल जाएगा निम्नलिखित उत्पादन चलाते हैं: -
f1: A
f1: A DONE
f1: B
f1: B DONE
हालांकि, अगर मैं f1("A", "Str");
और f1("B", "Str");
लाइनों टिप्पणी और उनके ऊपर लाइनों uncomment, तो नतीजा है : -
f1: A
f1: B
f1: A DONE
f1: B DONE
के बाद से Str
संस्करण में काम किया तो मैं उम्मीद कर रहा था कि शायद जावा equals
चे का उपयोग करता है synchronized
ब्लॉक या शायद hashCode
के लिए सीके लेकिन दूसरे परीक्षण से ऐसा लगता है, यह बिल्कुल मामला नहीं है।
String
एक विशेष मामला है?