सिंक्रनाइज़ेशन को देखने और समझने की कोशिश कर रहा है।सिंक्रनाइज़ ब्लॉक में स्थिर बनाम गैर स्थैतिक लॉक ऑब्जेक्ट
- एक स्थिर ताला वस्तु (कोड ए) और एक गैर स्थिर ताला वस्तु (कोड बी) का उपयोग कर के बीच मतभेद एक के लिए सिंक्रनाइज़ ब्लॉक क्या हैं?
- व्यावहारिक अनुप्रयोगों में यह अलग कैसे है?
- किसी के पास क्या नुकसान होगा जो दूसरे नहीं होगा?
- कौन सा उपयोग करने के लिए निर्धारित करने के लिए मानदंड क्या हैं?
कोड एक
public class MyClass1 {
private static final Object lock = new Object();
public MyClass1() {
//unsync
synchronized(lock) {
//sync
}
//unsync
}
}
कोड बी
public class MyClass2 {
private final Object lock = new Object();
public MyClass2() {
//unsync
synchronized(lock) {
//sync
}
//unsync
}
}
नोट
ऊपर कोड कंस्ट्रक्टर्स से पता चलता है, लेकिन आप के बारे में कैसे बात कर सकते हैं beha vior एक स्थिर विधि और एक गैर स्थैतिक विधि में भी अलग है। साथ ही, क्या एक स्थिर लॉक का उपयोग करना फायदेमंद होगा जब सिंक्रनाइज़ ब्लॉक स्थिर सदस्य चर को संशोधित कर रहा है?
मैंने पहले ही this question में उत्तर देखा है, लेकिन यह स्पष्ट नहीं है कि विभिन्न उपयोग परिदृश्य क्या हैं।
"ध्यान दें कि उपरोक्त कोड रचनाकारों को दिखाता है," यह एक महत्वपूर्ण भेद है। एक कन्स्ट्रक्टर पर एक इंस्टेंस फ़ील्ड वाला एक सिंक्रनाइज़ ब्लॉक बिल्कुल व्यर्थ है, क्योंकि एक ही उदाहरण पर कोई भी दो थ्रेड कभी कन्स्ट्रक्टर निष्पादित नहीं करेगा। – Thilo
असल में, इसके बारे में सोचने के लिए आओ, उस उदाहरण फ़ील्ड में एक ऑब्जेक्ट हो सकता है जो धागे के बीच साझा किया जाता है। उदाहरण के लिए 'निजी अंतिम ऑब्जेक्ट लॉक = "niceLiteralString"; '। – Thilo
मैं एक उदाहरण दिखाने के लिए रचनाकारों का उपयोग करके समझना एक बुरा विचार था। मेरा प्रश्न स्थिर और गैर स्थैतिक तरीकों तक भी विस्तारित है। साथ ही, स्थैतिक/उदाहरण फ़ील्ड को लॉकिंग को कैसे प्रभावित करता है? – ADTC