2012-08-27 56 views
8

जब आपके पास किसी ऑब्जेक्ट (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 एक विशेष मामला है?

उत्तर

18

नहीं, जावा लॉक मॉनीटर के लिए equals का उपयोग नहीं करता है।

लॉक ऑब्जेक्ट इंस्टेंस पर ही है। इसलिए, एक तरह से, यह "==" का उपयोग करता है, यदि आप करेंगे (लेकिन हकीकत में, यह नहीं है कि यह कैसे कार्यान्वित किया जाता है। प्रत्येक ऑब्जेक्ट में वर्तमान लॉक मालिक के लिए एक विशेष स्लॉट है)।

स्ट्रिंग के लिए कोई विशेष मामला नहीं है।

क्या स्ट्रिंग्स के साथ क्या हो रहा है, हालांकि, कि स्ट्रिंग शाब्दिक जमा हो जाता है, और यदि आप एक बार से एक ही शाब्दिक अधिक है, यह एक ही उदाहरण में परिणाम होगा (new X अलग-अलग विविधताएं बनाता है जबकि new String होगा के रूप में,)। यदि आप अपने "नए" स्ट्रिंग्स पर intern पर कॉल करते हैं, तो आप शायद वही प्रभाव देखेंगे।