यह मेरे पिछले प्रश्न के उत्तराधिकारी, Is this variable being safely accessed by using synchronization?"सिंक्रनाइज़ (यह)" बनाम "सिंक्रनाइज़ ((बेस क्लास) यह)" जावा में?
निम्नलिखित कार्यक्रम के लिए,
Class SubClassB extends SuperClassA {
protected int c;
public void inc() {
synchronized (this) {
c++;
}
}
public void dec() {
synchronized ((SuperClassA) this) {
c--;
}
}
}
काउंटर "सी" धागा सुरक्षित पहुँचा जा चाहेंगे है? मुझे यकीन नहीं है कि "dec()" विधि में, SuperClassA कास्ट "यह" सिंक्रनाइज़ किए गए ब्लॉक के लिए एक वैध वस्तु संदर्भित करता है? यदि हां, तो क्या दो सिंक्रनाइज़ किए गए ब्लॉक समान "इस" ऑब्जेक्ट को लॉक करेंगे? (जैसा कि मुझे लगता है कि "(सुपरक्लासए) यह" बराबर नहीं है ")
यह अजीब सिमुलेट कोड निम्नलिखित वास्तविक जीवन उदाहरण से आता है जहां सुपर क्लास एक मूल श्रेणी है जिसे संशोधित नहीं किया जाना चाहिए,
Class SuperClassA {
protected int c;
public void dec() {
synchronized (this) {
c--;
}
}
}
Class SubClassB extends SuperClassA {
public void inc() {
synchronized (this) {
c++;
}
}
public void dec() {
super.dec();
}
}
इस उदाहरण में, SubClassB में "दिसम्बर()" विधि अपने सुपर क्लास के "दिसम्बर()" विधि है जो एक "इस" उद्देश्य यह है कि मैं "SuperClassA.this" होने के लिए लगता है के लिए एक लॉक करता है कहता है। यदि SubClassB की "inc()" विधि में लॉक ऑब्जेक्ट ठीक से SubClassB की "dec()" विधि में लॉक ऑब्जेक्ट जैसा नहीं है, तो मुझे लगता है कि SubClassB में विरासत काउंटर "सी" को अलग-अलग धागे से सुरक्षित रूप से एक्सेस नहीं किया जा सकता है । मुझे लगता है कि सिंक्रनाइज़ ब्लॉक में "इस" संदर्भ का उपयोग करने में कुछ अस्पष्टताएं हैं।
वास्तविक जीवन उदाहरण में, यदि मैं चाहता हूँ SubClassB के काउंटर "सी" सुरक्षित थ्रेड किया जाना है,, मैं इस तरह अपने "दिसम्बर()" विधि में एक और सिंक्रनाइज़ ब्लॉक को जोड़ने के लिए, की जरूरत है
Class SubClassB extends SuperClassA {
public void inc() {
synchronized (this) {
c++;
}
}
public void dec() {
synchronized (this) {
super.dec();
}
}
}
लेकिन ऐसा लगता है कि इस तरह के जोड़ा ब्लॉक सुरुचिपूर्ण नहीं है और अनावश्यक हो सकता है!
क्या किसी के पास इन सवालों पर कुछ विचार हैं। अग्रिम में धन्यवाद।
लॉरेंस
आपके उत्तरों के लिए धन्यवाद। – user1129812