2012-12-14 26 views
5

सी #/.NET 4.0 का उपयोग करके, Lazy<T> ऑब्जेक्ट निम्नानुसार घोषित किया जा सकता है।सिस्टम। आलसी <T> और सिस्टम। थ्रेडिंग। लाज़ी थ्रेडस्फीटीमोम गणना

using System; 
using System.Threading; 
... 
var factory =() => { return new object(); }; 
var lazy = new Lazy<object>(factory, LazyThreadSafetyMode.ExecutionAndPublication); 

LazyThreadSafetyMode गणन से अन्य विकल्प PublicationOnly और None हैं।

कोई ExecutionOnly विकल्प क्यों नहीं है?

इस मामले में व्यवहार यह होगा कि फैक्ट्री विधि को एक बार एक ही थ्रेड द्वारा बुलाया जाता है, भले ही एकाधिक धागे lazy.Value प्राप्त करने का प्रयास करें। एक बार कारखाने की विधि पूरी हो जाने के बाद और एकल परिणाम कैश किया गया था, कई धागे आलसी तक पहुंचने में सक्षम होंगे। साथ ही वैल्यू (यानी, आरंभिक फैक्ट्री विधि के बाद कोई धागा सुरक्षा नहीं)।

उत्तर

8

आपके द्वारा वर्णित व्यवहार प्रभावी ढंग से LazyThreadSafetyMode.ExecutionAndPublication है। यह एकाधिक धागे को Value तक पहुंचने की अनुमति देता है, लेकिन प्रारंभिक विधि को चलाने के लिए केवल एक ही धागा है।

यह गणना पूरी तरह से यह निर्धारित करने के लिए है कि निर्माण कैसे होता है - आप हमेशा कई धागे से Value तक पहुंच सकते हैं।