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).