आपके पास दो विकल्प: अपने प्रस्तुत कोड के लिए सबसे आसान दी volatile
कीवर्ड है। needsToBeThreadSafe
को static volatile int
के रूप में घोषित करें और यह गारंटी देगा कि उस चर के संदर्भ में कोई भी थ्रेड "नवीनतम" प्रतिलिपि प्राप्त करेगा, और चर को आपके कोड में कैश नहीं किया जाएगा।
कहा जा रहा है, यदि आप अधिक आम तौर पर यह सुनिश्चित करें कि M1()
और M2()
निष्पादित "atomically" चाहते हैं (या एक दूसरे के लिए कम से कम विशेष रूप से), तो आप एक lock
उपयोग करना चाहते हैं। साफ वाक्य रचना एक "लॉक ब्लॉक", इस तरह से है:
private static object locker = new Object();
//..
public static void M1()
{
lock(locker)
{
//..method body here
}
}
public static void M2()
{
lock(locker)
{
//..method body here
}
}
के रूप में जो दृष्टिकोण लेने के लिए, कि आप पर निर्भर है करने के लिए और कोड द्वारा निर्धारित किया जाना चाहिए। यदि आपको केवल यह सुनिश्चित करना है कि एक सदस्य असाइनमेंट सभी धागे के लिए प्रचारित हो जाता है और कैश नहीं किया जाता है, तो volatile
कीवर्ड सरल है और यह काम ठीक होगा। यदि यह उससे परे है, तो आप lock
के साथ जाना चाह सकते हैं।
स्रोत
2009-08-10 13:06:57
मतलब है कि आप एम 1() और एम 2 के लिए कॉल चाहते हैं() परमाणु हो सकता है? – Bombe
"थ्रेड थ्रेड सुरक्षित" से आपका क्या मतलब है? –