Dopo .NET 4.0, nel .NET Framework veniva fornito un tipo di caricamento sicuro e pigroPigro Lazy è in grado di operare in un ambiente multi-thread, garantitoGetValueLa funzione viene eseguita solo una volta, implementando cosìModalità singola
In passato, utilizzavamo blocchi di giudizio quadratico per implementare pattern singleton, o per utilizzare funzioni di inizializzazione statiche delle classi Con il tipo pigro, questo processo è semplificato e le prestazioni migliorano
Quando viene creato Lazy puoi specificare la modalità di installazione del thread, attualmente ci sono due modalità,Solo pubblicazione,Esposizione e pubblicazione
Modalità Solo pubblicazione
1. Esegui la funzione di inizializzazione e inseriscila in un sistema internoScatolatipi, risolvendo il problema del giudizio di valore nullo, se il caso è stato creato, restituirà nullo,Il processo è insicuro nei thread
2. Determinare se il m_boxed è vuoto, m_boxed è il campo salvato per valore, se è uguale a vuoto, è impostato su scatolato, questo metodo può garantire atomicità,Il processo è sicuro per il filo
3. Se CreateValue restituisce vuoto, significa che altri thread hanno già creato istanze, quindi impostate su istanze già create
4. Segna il metodo di inizializzazione come inizializzato, cosa che di solito avviene nel caso di esecuzione concorrente, ed esegui CreateValue più volte
Solo pubblicazioneLa modalità viene utilizzata in base aInterbloccato.CompareExchange, questa classe contiene metodi di atomicitàCAS (Confronto e scambio)
Il CAS è implementato utilizzando istruzioni atomiche fornite dalla CPU, e diverse versioni di runtime possono avere implementazioni differenti Implementazione specifica interbloccata Nel metodo nativo, gli amici interessati possono verificare l'implementazione specifica tramite codice coreclr/jvm
In questa modalità,Una funzione singleton può eseguire più volte, ma alla fine è garantito che si otterrà solo un'istanza
Modalità di Esposizione e Pubblicazione
Esposizione e pubblicazionemodalità utilizzata nella modalitàVolatile+Monitor,MonitorLo èserraturaL'implementazione dell'istruzione, l'implementazione Monitor nel codice nativo, è un blocco pesante
MonitorSono supportati il sleep di coda e thread, che può garantire che l'intero blocco di metodo venga eseguito in uno stato single-threaded
Link originale:Il login del link ipertestuale è visibile. |