आपके प्रश्न का उत्तर करने के लिए (के रूप में कुछ अन्य लोगों के पहले से ही है), वहाँ कोड उदाहरण आपके द्वारा दी गई कुछ संभावित समस्याओं हैं:
private static string mutex= "ABC";
- चर
mutex
अपरिवर्तनीय नहीं है।
- स्ट्रिंग शाब्दिक
"ABC"
आपके एप्लिकेशन में हर जगह एक ही इंटर्न वाले ऑब्जेक्ट संदर्भ को संदर्भित करेगा।
सामान्य रूप से, मैं स्ट्रिंग पर लॉकिंग के खिलाफ सलाह दूंगा। हालांकि, एक ऐसा मामला है जहां मैंने भाग लिया है जहां यह करने के लिए उपयोगी है।
ऐसे मौके हैं जहां मैंने लॉक ऑब्जेक्ट्स का एक शब्दकोश बनाए रखा है जहां कुंजी मेरे पास कुछ डेटा के बारे में कुछ अद्वितीय है।
void Main()
{
var a = new SomeEntity{ Id = 1 };
var b = new SomeEntity{ Id = 2 };
Task.Run(() => DoSomething(a));
Task.Run(() => DoSomething(a));
Task.Run(() => DoSomething(b));
Task.Run(() => DoSomething(b));
}
ConcurrentDictionary<int, object> _locks = new ConcurrentDictionary<int, object>();
void DoSomething(SomeEntity entity)
{
var mutex = _locks.GetOrAdd(entity.Id, id => new object());
lock(mutex)
{
Console.WriteLine("Inside {0}", entity.Id);
// do some work
}
}
इस तरह कोड के लक्ष्य इकाई के Id
के संदर्भ में DoSomething()
के समवर्ती आमंत्रण क्रमानुसार करने है: यह एक काल्पनिक उदाहरण है। नकारात्मक शब्दकोष है। वहां जितनी अधिक इकाइयां होती हैं, उतनी ही बड़ी होती है। यह पढ़ने और सोचने के लिए भी और अधिक कोड है।
मुझे लगता है।नेट की स्ट्रिंग होना शामिल चीजों को आसान बनाने में कर सकते हैं:
void Main()
{
var a = new SomeEntity{ Id = 1 };
var b = new SomeEntity{ Id = 2 };
Task.Run(() => DoSomething(a));
Task.Run(() => DoSomething(a));
Task.Run(() => DoSomething(b));
Task.Run(() => DoSomething(b));
}
void DoSomething(SomeEntity entity)
{
lock(string.Intern("dee9e550-50b5-41ae-af70-f03797ff2a5d:" + entity.Id))
{
Console.WriteLine("Inside {0}", entity.Id);
// do some work
}
}
यहाँ अंतर यह है कि मैं स्ट्रिंग मुझे इकाई आईडी प्रति एक ही वस्तु संदर्भ देने के लिए होना शामिल पर भरोसा कर रहा हूँ। यह मेरे कोड को सरल बनाता है क्योंकि मुझे mutex उदाहरणों के शब्दकोश को बनाए रखने की आवश्यकता नहीं है।
हार्ड-कोडित यूयूआईडी स्ट्रिंग पर ध्यान दें जिसे मैं नामस्थान के रूप में उपयोग कर रहा हूं। यह महत्वपूर्ण है यदि मैं अपने आवेदन के किसी अन्य क्षेत्र में तारों पर लॉकिंग के समान दृष्टिकोण को अपनाना चुनता हूं।
स्ट्रिंग्स पर लॉक करना परिस्थितियों और ध्यान के आधार पर डेवलपर विवरण के आधार पर एक अच्छा विचार या बुरा विचार हो सकता है।
धन्यवाद जीवीएस। लेकिन मैं सोच रहा था कि एक स्ट्रिंग प्रकार (स्ट्रिंग होने योग्य स्ट्रिंग) का उपयोग करके लॉक करने के लिए किसी ऑब्जेक्ट प्रकार (जिसे हम आम तौर पर करते हैं) का उपयोग करने में कोई अंतर होता है। इस कार्यक्रम में बड़ी संख्या में थ्रेड विवाद हैं (अभी तक सुनिश्चित नहीं है कि यह कोड के इस टुकड़े के कारण है)। – Illuminati
स्ट्रिंग्स म्यूटेबल नहीं हैं, वे सिर्फ म्यूटेबल दिखते हैं, लेकिन प्रत्येक अलग स्ट्रिंग दूसरे संदर्भ में इंगित करती है। मुझे उन पर ताला लगाने के लिए अजीब लग रहा है। क्या आपने रीडरवाइटर लॉक को आजमाया था। – GvS
क्षमा करें, मेरा मतलब है "स्ट्रिंग अपरिवर्तनीय" :) .. मैंने रीडरवाइटर लॉक के साथ प्रयास नहीं किया था .. केवल कोड के सटीक खंड को समझने की कोशिश कर रहा था जो मुद्दों का कारण बनता है। अपर्याप्त डेटा के कारण स्थानीय enviornment में situcation फिर से बनाना मुश्किल है। लेकिन मैं इसे पुनः उत्पादन में कुछ कोशिश करने जा रहा हूं। एक बार फिर धन्यवाद। – Illuminati