को देखते हुए निम्नलिखित कोड:एक चर (थ्रेड) की थ्रेड-सुरक्षित सेटिंग?
public class FooBar {
public static volatile ConcurrentHashMap myConfigData = new ConcurrentHashMap();
}
public class UpdaterThread implements Runnable {
run {
//Query the Data from the DB and Update the FooBar config Data
FooBar.myConfigData = ConfigDataDAO.getLatestConfigFromDB();
}
}
(एक निर्वाहक हर 5 मिनट के माध्यम से) थ्रेड-कक्षा myConfigData Membervariable नियमित रूप से अपडेट हो जाएगा। "बाहरी" थ्रेड थ्रेडसेफ (परमाणु) में myConfigData की सेटिंग है, या क्या मुझे हर पढ़ने और लिखने के ऑपरेशन को myConfigData Variable में सिंक्रनाइज़ करना है?
संपादित करें: प्रश्न यह नहीं है कि ConcurrentHashMap थ्रेडसेफ है (यह जावाडोक के अनुसार है) बल्कि ConconrentHashMap को MyConfigData सदस्य चर में स्वयं की सेटिंग के बजाय। यह चर कई धागे द्वारा "एक बार" पढ़ और लिखा जा सकता है, इसलिए सवाल यह है कि सेटिंग परमाणु है या नहीं। मुझे लगता है कि यह सामान्यीकृत किया जा सकता है "क्या जावा संदर्भ चर परमाणु है या नहीं?"।
(मैं भी यह अस्थिर यह एक अलग मुद्दा है बना दिया है और atomicity साथ कोई संबंध नहीं है - मेरे सवाल - बल्कि "अन्य धागे में दृश्यता" और होता है-पहले संबंध।।)
@ अज्ञात: उद्धृत पाठ यह नहीं कहता कि आप क्या सोचते हैं !! वास्तव में, JLS में अगले बुलेट इस कहते हैं: "स्पष्ट तुल्यकालन के अभाव में, एक कार्यान्वयन एक आदेश है कि आश्चर्य की बात हो सकती है में मुख्य स्मृति अद्यतन करने के लिए नि: शुल्क है इसलिए प्रोग्रामर जो आश्चर्य से बचने के लिए स्पष्ट तुल्यकालन का उपयोग करना चाहिए पसंद करती हैं।। " –
@ अज्ञात: ओपी का कोड सुरक्षित होने का एकमात्र कारण यह है कि उन्होंने चर को 'अस्थिर' घोषित कर दिया है। –
@ स्टीफन मुझे लगता है कि प्रश्न का मुख्य बिंदु असाइनमेंट की परमाणुता के बारे में था। यही कारण है कि मैंने कल्पना के इस हिस्से को उद्धृत किया। यदि मैं सही ढंग से समझता हूं, तो अस्थिरता का उपयोग नहीं होने पर भी इस परमाणु की गारंटी है। हालांकि यह हो सकता है कि अन्य धागे चर को अद्यतन नहीं देखेंगे और "पुराना" संदर्भ देखना जारी रखें। हालांकि एक धागा कभी "किसी अन्य वस्तु या भ्रष्ट संदर्भ मान का संदर्भ" नहीं देखेगा। – Wolfgang