मुझे यह विश्वास करने के लिए उठाया गया है कि यदि एकाधिक धागे एक चर का उपयोग कर सकते हैं, तो सभी को उस वैरिएबल से पढ़ना और लिखना सिंक्रनाइज़ेशन कोड, जैसे कि "लॉक" कथन द्वारा संरक्षित किया जाना चाहिए, क्योंकि प्रोसेसर दूसरे थ्रेड पर स्विच कर सकता है एक लिखने के माध्यम से आधे रास्ते।सी # एक परमाणु ऑपरेशन में एक चर का उपयोग कर रहा है?
हालांकि, मैं परावर्तक का उपयोग कर System.Web.Security.Membership के माध्यम से देख रही है और इस तरह कोड मिला था:
public static class Membership
{
private static bool s_Initialized = false;
private static object s_lock = new object();
private static MembershipProvider s_Provider;
public static MembershipProvider Provider
{
get
{
Initialize();
return s_Provider;
}
}
private static void Initialize()
{
if (s_Initialized)
return;
lock(s_lock)
{
if (s_Initialized)
return;
// Perform initialization...
s_Initialized = true;
}
}
}
क्यों s_Initialized क्षेत्र ताला के बाहर पढ़ने के लिए है? क्या एक और धागा एक ही समय में लिखने की कोशिश नहीं कर सका? परमाणु चर के पढ़ और लिख रहे हैं?
आप में से उन लोगों के लिए जो इस पोस्ट को पढ़ रहे हैं * वर्तमान में * मौजूद है, यह थोड़ा उलझन में है। उपरोक्त कोड को लॉक (अंदर और बाहर) के साथ दोबारा जांचने के लिए ** सही ** तरीका प्रदर्शित करने के लिए समायोजित किया गया है। हालांकि, प्रश्न पाठ प्रारंभिक कोड नमूना को संदर्भित करता है जिसमें दूसरी 's_initialized' चेक शामिल नहीं है। संपादन इतिहास को देखे बिना यह थोड़ा उलझन में है। – GEEF
@GEEF भ्रम के लिए खेद है, लेकिन सवाल वर्तमान कोड को संदर्भित करता है, जिसमें 'लॉक' के अंदर दूसरी जांच भी शामिल है। यह दोबारा जांच लॉकिंग के बारे में कोई सवाल नहीं है, यह परमाणु स्मृति पहुंच के बारे में है, और क्या एक बूलियन को उसी समय लिखा जा सकता है जब इसे पढ़ा जा रहा है। –