8

यह answer देखें। यह कहता है:एक परिवर्तनीय वस्तु पर लॉक करना - इसे एक बुरा अभ्यास क्यों माना जाता है?

छह वास्तव में खराब उदाहरण;

...

एक उत्परिवर्तनीय क्षेत्र पर लॉकिंग। जैसे सिंक्रनाइज़ (ऑब्जेक्ट) {ऑब्जेक्ट = ...; }

एक परिवर्तनीय क्षेत्र पर लॉक करने में क्या गड़बड़ है? क्या होगा अगर object को final के रूप में घोषित किया गया था, लेकिन यह एक अपरिवर्तनीय कक्षा नहीं थी?

+1

मुझे लगता है कि आप अपरिवर्तनीय वर्गों के साथ उत्परिवर्तनीय क्षेत्रों को भ्रमित कर रहे हैं (एक वर्ग जिसमें केवल अपरिवर्तनीय फ़ील्ड हैं)। –

उत्तर

14

यह एक बुरा विचार है क्योंकि यदि कोई अन्य थ्रेड महत्वपूर्ण खंड में संदर्भ बदलता है, तो धागे अब एक ही संदर्भ को नहीं देख पाएंगे, और इसलिए वे एक ही ऑब्जेक्ट पर सिंक्रनाइज़ नहीं करेंगे, इस प्रकार अनियंत्रित चल रहे हैं। उदाहरण:

synchronized(lock1) { 
    lock1 = new Object(); 
    sharedVariable++; 
} 

मान लें कि 2 धागे इस महत्वपूर्ण खंड में प्रवेश करने की कोशिश कर रहे हैं। थ्रेड 1 प्रवेश और थ्रेड 2 इंतजार कर रहा है। थ्रेड 1 चला जाता है, lock1 पुन: असाइन करता है और आय प्राप्त करता है। अब थ्रेड 2 एक थ्रेड 1 प्राप्त करने की तुलना में एक अलग लॉक देखता है, जो भी मुफ़्त है, इसलिए यह महत्वपूर्ण अनुभाग भी दर्ज कर सकता है। मज़ा आता है!

यदि ऑब्जेक्ट final है, तो आप किसी भिन्न ऑब्जेक्ट के संदर्भ को पुन: असाइन नहीं कर सकते हैं, इसलिए उपर्युक्त समस्या अब लागू नहीं होती है।

5

"उत्परिवर्तनीय" यहां सही शब्द नहीं है। एक म्यूटेबल ऑब्जेक्ट को लॉक करना ठीक है, यानी राज्य के साथ एक ऑब्जेक्ट। फ़ील्ड को लॉक करना गलत है, इसे बदलें, और एक ही थ्रेड को उसी ऑब्जेक्ट पर लॉक करने की अपेक्षा करें।

1

मुझे नहीं लगता कि एक म्यूटेबल ऑब्जेक्ट लॉक करना स्वयं में खराब है। इसे सही करने के लिए बहुत मुश्किल है। समवर्ती प्रसंस्करण के लिए अन्य मॉडल हैं, जैसे अभिनेता। मेरा सुझाव है कि आप अक्का में देखें, जिसका उपयोग जावा और स्कैला दोनों से किया जा सकता है, और यह एक बहुत ही ठोस कार्यान्वयन है।

संबंधित मुद्दे

 संबंधित मुद्दे