Recentemente ho riscontrato una condizione di competizione mentre accedevo a un'impostazione di configurazione. Dopo aver esaminato ciò che potevo del codice, sono giunto alla conclusione che la classe Configuration
'pigrizia 1 era la fonte della condizione di competizione. Il pondering che mi porta a chiedermi se la pigrizia produce naturalmente una maggiore possibilità di condizioni di gara?
Ecco come sono arrivato alla ricerca iniziale:
La classe Configuration
è implementata come classe statica , che significa:
The program cannot specify exactly when the class is loaded. However, it is guaranteed to be loaded and to have its fields initialized and its static constructor called before the class is referenced for the first time in your program.
Che, se lo leggo correttamente, è un modo lungo per dire che la classe è caricata pigramente. Non ho trovato nulla che faccia riferimento all'ordinamento degli eventi quando si utilizzano risorse aggiuntive. cioè non ha detto quando il file di configurazione ( app.config
) sarebbe stato letto.
E mentre la classe stessa afferma quanto segue per la sicurezza dei thread, non è chiaro quando legge effettivamente il file di configurazione.
Any public static members of this type are thread safe. Any instance members are not guaranteed to be thread safe.
Il bit su Any instance members are not guaranteed to be thread safe
è particolarmente confuso dal momento che non può essere istanziata una classe statica .
Quello che credo sia accaduto è che il mio programma ha scritto su una sezione di Configuration
che è stata successivamente sovrascritta quando l'istanza statica ha completato l'inizializzazione e la lettura dal file di configurazione.
Tutto ciò mi ha portato a credere che il pigro caricamento della classe statica con la sua lettura indeterminata del file di configurazione ha creato la condizione di gara in cui mi sono imbattuto.
Il che mi porta alla mia più ampia domanda su: la pigrizia all'interno di un'applicazione offre naturalmente maggiori possibilità di condizioni di gara?
1 La particolare classe in questione è System.Configuration.Configuration dal framework .NET che è definito come public static class ConfigurationManager
.
Per i dettagli sanguinosi, questa è la versione astratta del codice:
//This first line probably isn't required, but I inherited the code and didn't test removing it.
System.Configuration.Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
config.ConnectionStrings.ConnectionStrings[DBName].ConnectionString = passedParam;
config.Save();
...
ConnectionStringSettings connectionString = ConfigurationManager.ConnectionStrings[DBName];
Le risposte da qui suggeriscono la mia domanda, ma non riguardano direttamente la mia preoccupazione per le condizioni di gara. E questo è in qualche modo correlato ma più focalizzato su IoC.