2012-12-14 9 views
5

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

risposta

8

Il comportamento che stai descrivendo è in effetti LazyThreadSafetyMode.ExecutionAndPublication. Ciò consente a più thread di accedere a Value, ma solo un singolo thread per eseguire il metodo di inizializzazione.

Questa enumerazione serve esclusivamente a determinare come avviene la creazione: è sempre possibile accedere a Value da più thread.