6

System.Collections.Queue कक्षा में Queue.Synchronized विधि है जो थ्रेड-सुरक्षित कतार कार्यान्वयन देता है।क्यों नहीं संग्रह .Generic.Queue सिंक्रनाइज़ विधि है लेकिन संग्रह। Queue है?

लेकिन जेनेरिक एक, System.Collections.Generic.Queue में Synchronized विधि नहीं है। इस बिंदु पर मेरे मन में दो प्रश्न हैं:

  1. सामान्य व्यक्ति के पास यह विधि क्यों नहीं है? क्या यह एक ढांचा एपीआई डिजाइन निर्णय है?
  2. Queue.Synchronized से कतार लौटाई गई ConcurrentQueue<T> कक्षा से अलग है?

धन्यवाद।

उत्तर

13

Synchronized() विधि एक रैपर कतार लौटाती है जो हर विधि के चारों ओर एक लॉक थप्पड़ मारती है।
बहु-थ्रेडेड अनुप्रयोगों को लिखते समय यह पैटर्न वास्तव में उपयोगी नहीं है।

अधिकांश वास्तविक दुनिया के उपयोग पैटर्न सिंक्रनाइज़ किए गए संग्रह के लिए लाभ नहीं उठाएंगे; उन्हें अभी भी उच्च स्तरीय संचालन के आसपास ताले की आवश्यकता होगी।

इसलिए Synchronized()System.Collections में विधियां वास्तव में एक जाल है जो लोगों को गैर-थ्रेड-सुरक्षित कोड लिखने में ले जाती है।


ConcurrentQueue<T> वर्ग विशेष रूप से समवर्ती अनुप्रयोगों के लिए बनाया गया है और उपयोगी तरीकों कि atomically कतार संशोधित होता है।

समवर्ती संग्रह पैकेज में केवल वे विधियां हैं जो बहु-थ्रेडेड वातावरण (उदाहरण के लिए, TryDequeue()) में उपयोग करने के लिए समझ में आती हैं; वे आपको कोड लिखने में मार्गदर्शन करने में मदद करेंगे जो वास्तव में थ्रेड-सुरक्षित है।

इसे pit of success कहा जाता है।

और अधिक जानकारी के लिए, my blog

+0

देख मैं वास्तव में अगर तुम मेरा पहला सवाल का जवाब कर सकते हैं इसके बाद के संस्करण की सराहना करेंगे। धन्यवाद! –

+0

@ahmetalpbalkan: क्योंकि यह विधि बेकार से भी बदतर है। – SLaks

संबंधित मुद्दे