यह article जावा के "सिंक्रनाइज़" कीवर्ड के बारे में वार्तालाप करता है।जावा थ्रेड "सिंक्रनाइज़"
...
private int foo;
public synchronized int getFoo() { return foo; }
public synchronized void setFoo(int f) { foo = f; }
एक फोन करने वाले foo संपत्ति बढ़ाने के लिए चाहता है, ऐसा करने के लिए निम्न कोड थ्रेड-सुरक्षित नहीं है:
...
setFoo(getFoo() + 1);
दो धागे एक ही समय में foo बढ़ाने के लिए प्रयास करते हैं, नतीजा यह हो सकता है कि समय के आधार पर foo का मूल्य एक या दो से बढ़ जाता है।
अब, मेरे सवाल:
क्यों setFoo पर "सिंक्रनाइज़" नहीं करता है() के ऊपर बोल्ड लाइन को रोकने?
'फिर उनमें से प्रत्येक एक को जोड़ता है और सेटफू को कॉल करता है, और अंत परिणाम यह है कि foo केवल दो बार की बजाय बढ़ता है, क्यों? –
क्योंकि प्रत्येक थ्रेड एक ही मान पर 'foo' अपडेट करता है। उदाहरण के लिए, उनमें से प्रत्येक को मान 2 मिल जाता है, उनमें से प्रत्येक 3 प्राप्त करने के लिए 1 जोड़ता है, फिर उनमें से प्रत्येक मान को 3. – rgettman
पर सेट करता है यदि मैं सही समझता हूं, तो आपका कथन नहीं होना चाहिए 'फिर उनमें से प्रत्येक एक को जोड़ना चाहिए और setFoo को कॉल करें, और अंतिम परिणाम यह है कि foo बढ़ी ** ** दो बार **? –