क्या निम्न कोड एक ही समस्या का कारण बनेंगे, यदि इस विधि का चर 'सामान्यसेट' क्लास स्तर फ़ील्ड था। यदि यह कक्षा स्तर का क्षेत्र था, तो मुझे सिंक्रनाइज़ किए गए ब्लॉक के भीतर ऑपरेशन सेट करने के लिए जोड़ना होगा क्योंकि हैशसेट थ्रेड सुरक्षित नहीं है। मुझे निम्नलिखित कोड में ऐसा ही करना चाहिए, क्योंकि सेट पर एकाधिक थ्रेड जोड़ रहे हैं या यहां तक कि वर्तमान थ्रेड सेट को म्यूटेट करने के लिए भी जा सकता है।थ्रेड सेफ - अंतिम स्थानीय विधि चर धागे पर पारित किया गया?
public void threadCreatorFunction(final String[] args) {
final Set<String> commonSet = new HashSet<String>();
final Runnable runnable = new Runnable() {
@Override
public void run() {
while (true) {
commonSet.add(newValue());
}
}
};
new Thread(runnable, "T_A").start();
new Thread(runnable, "T_B").start();
}
'सामान्यसेट' का संदर्भ अंतिम उपयोग करके 'लॉक' है। लेकिन उस पर चलने वाले कई धागे अभी भी सेट में मानों को भ्रष्ट कर सकते हैं (इसमें डुप्लिकेट हो सकते हैं?)। दूसरा, भ्रम 'सामान्यसेट' के बाद से एक विधि स्तर चर है - यह वही संदर्भ कॉलिंग विधि (थ्रेड क्रिएटर फ़ंक्शन) की स्टैक मेमोरी पर होगा और रन विधियों की स्मृति को ढेर करेगा - क्या यह सही है?
काफी कुछ इस से संबंधित प्रश्न होते हैं:
- Why do variables passed to runnable need to be final?
- Why are only final variables accessible in anonymous class?
लेकिन, मैं उन्हें इस तरह के बंटवारे/mutables के निधन की धागा सुरक्षित भाग पर बल देते नहीं देख सकता।
यह भी देखें http://stackoverflow.com/questions/1299837/cannot-refer-to-a-non-final-variable-inside-an-inner-class-defined-in-a-differen – nos