Atomicità dell'operatore di carbone C#
-
12-11-2019 - |
Domanda
Oggi mi sono imbattuto in un codice singleton nella nostra base di codice e non ero sicuro se il seguente fosse thread-safe:
public static IContentStructure Sentence{
get {
return _sentence ?? (_sentence = new Sentence());
}
}
Questa affermazione è equivalente a:
if (_sentence != null) {
return _sentence;
}
else {
return (_sentence = new Sentence());
}
Credo che ?? è solo un trucco del compilatore e che il codice risultante non è ancora atomico. In altre parole, due o più thread potrebbero trovare _sentenza essere nullo prima di impostare _sentenza su una nuova frase e restituirla.
Per garantire l'atomicità, dovremmo bloccare quel bit di codice:
public static IContentStructure Sentence{
get {
lock (_sentence) { return _sentence ?? (_sentence = new Sentence()); }
}
}
È tutto corretto?
Nessuna soluzione corretta
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow