2012-12-14 30 views
5

Używanie obiektu C#/.NET 4.0, a Lazy<T> można zadeklarować w następujący sposób.System.Lazy <T> i System.Threading.LazyThreadSafetyMode Enumeration

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

Inne opcje z LazyThreadSafetyMode wyliczenia są PublicationOnly i None.

Dlaczego nie ma opcji ExecutionOnly?

Zachowanie w tym przypadku polega na tym, że metoda fabryczna jest wywoływana co najwyżej raz przez pojedynczy wątek, nawet jeśli wiele wątków próbuje uzyskać lazy.Value. Gdy metoda fabryczna została zakończona, a pojedynczy wynik został zbuforowany, wiele wątków mogło uzyskać równoczesny dostęp do wartości leniwej. (Tzn. Brak bezpieczeństwa wątku po początkowej metodzie fabrycznej).

Odpowiedz

8

Zachowanie, które opisujesz, jest skuteczne LazyThreadSafetyMode.ExecutionAndPublication. Dzięki temu wiele wątków może uzyskać dostęp do Value, ale tylko jeden wątek może kiedykolwiek uruchomić metodę inicjowania.

Wyliczenie służy wyłącznie do określenia sposobu utworzenia - zawsze można uzyskać dostęp do Value z wielu wątków.