Utilizzando C# /. NET 4.0, un oggetto Lazy<T>
può essere dichiarato come segue.System.Lazy <T> e System.Threading.LazyThreadSafetyMode Enumeration
using System;
using System.Threading;
...
var factory =() => { return new object(); };
var lazy = new Lazy<object>(factory, LazyThreadSafetyMode.ExecutionAndPublication);
Altre opzioni dal LazyThreadSafetyMode
enumerazione sono PublicationOnly
e None
.
Perché non c'è l'opzione ExecutionOnly
?
In questo caso il comportamento sarebbe che il metodo factory viene chiamato al massimo una volta da un singolo thread, anche se più thread tentano di ottenere lazy.Value
. Una volta che il metodo factory è stato completato e il singolo risultato è stato memorizzato nella cache, molti thread sarebbero in grado di accedere a lazy.Value simultaneamente (cioè, nessuna sicurezza del thread dopo il metodo factory iniziale).