2012-07-13 3 views
5

निम्नलिखित कोड पर विचार करें, मैं इसे एक धागा सुरक्षित वर्ग बनाने के लिए, इतना है कि यह विषम संख्या मिल कभी नहीं होगा चाहते हैं:क्या मैं अंतिम फ़ील्ड में सिंक्रनाइज़ेशन का उपयोग कर सकता हूं?

class Test { 
    private int value = 0; 
    private final Object lock; 

    public void add() { 
    synchronized (lock) { 
     value++; 
     value++; 
    } 
    } 

    public int getValue() { 
    synchronized (lock) { 
     return value; 
    } 
    } 
} 

मैं अब ताला क्षेत्र है, जो अंतिम घोषित किया है संदेह कर रहा हूँ, यह होगा मामला? या यह थ्रेड सुरक्षा तोड़ देगा?

मुझे लगता है कि लॉक फ़ील्ड को अंतिम घोषित नहीं किया गया है, यह एक थ्रेड-सुरक्षित वर्ग होना चाहिए। यदि यह निष्कर्ष गलत है, तो कृपया मुझे सही करें, धन्यवाद।

+0

देखें [यह] (http://stackoverflow.com/questions/2101327/final-variable-and-synchronized-block-in-java) प्रश्न। – Lion

उत्तर

9

अब मुझे लॉक फील्ड का संदेह है, जिसे अंतिम घोषित किया गया है, क्या इससे कोई फर्क नहीं पड़ता?

हाँ, करने के लिए अपने विचार सबसे अच्छा अभ्यास केवलfinal क्षेत्र वस्तुओं ताला।

यदि आप संदर्भ बदल सकते हैं तो आप बदल सकते हैं कि कौन सा ऑब्जेक्ट लॉक है, थ्रेड सुरक्षा तोड़ रहा है।

0

जावा में सिंकोननाइज़ेशन लॉक ऑब्जेक्ट के कुछ छिपे हुए फ़ील्ड द्वारा किया जाता है। इसके अलावा अंतिम साधन, कि संदर्भ अंतिम है, ऑब्जेक्ट स्वयं नहीं।

उदाहरण:

final Bar bar = new Bar(); //bar hase property lock 
bar.lock = XYZ; //will work, object is not FINAL 
bar = new Bar(); //fail, the reference is FINAL 
+0

इसके लायक होने के लिए, जावा में 'ऑब्जेक्ट फ़ाइनल' बनाने के लिए कोई भी निर्माण नहीं हुआ है। अपरिवर्तनीयता प्रोग्रामेटिक रूप से लागू किया जाना चाहिए। – corsiKa

1

ठीक होना चाहिए। यहां तक ​​कि इसे सुरक्षित भी बना सकता है, क्योंकि कोई निष्पादन के दौरान लॉक में कुछ और निर्दिष्ट नहीं कर सकता है।

1

आप एक उदाहरण लॉक करने के लिए देख रहे हैं, तो अंतिम स्वीकार्य है। क्या आपको क्लास पर लॉक या म्यूटेक्स डालना चाहिए, फिर वैरिएबल स्थिर बनाएं।

0

जब आप एकाधिक धागे सिंक्रनाइज़ करने का प्रयास कर रहे हैं, तो उन्हें उसी ऑब्जेक्ट संदर्भ/उदाहरण के आधार पर सिंक्रनाइज़ करना होगा। यह सुनिश्चित करता है कि वे दोनों एक ही डेटा के आधार पर एक ही समय में सिंक्रनाइज़ करते हैं।

आशा है कि थोड़ा सा अर्थ हो; आपको केवल एक गतिशील एक के बजाय अंतिम चर के आधार पर सिंक्रनाइज़ करना होगा।

एक विधि एक स्थिर क्षेत्र को संशोधित करता है, तो आप उपयोग कर सकते को इस क्षेत्र सिंक्रनाइज़ चाहिए, भले ही प्रक्रिया आम तौर पर एक भी धागा द्वारा केवल प्रयोग किया जाता है। ग्राहकों के लिए ऐसी विधि पर बाहरी सिंक्रनाइज़ेशन करने के लिए संभव नहीं है क्योंकि की कोई गारंटी नहीं हो सकती है कि असंबद्ध ग्राहक इसी प्रकार, see करेंगे।

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