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
scroll top