Après lecture à propos de LazyInitializer
que c'est :
Il offre un autre mode d'initialisation qui fait que plusieurs threads font la course à l'initialisation.
Voici un échantillon :
Expensive _expensive;
public Expensive Expensive
{
get // Implement double-checked locking
{
LazyInitializer.EnsureInitialized (ref _expensive,() => new Expensive());
return _expensive;
}
}
Question n° 1
en regardant :
pourquoi #A dit qu'il implémente le verrouillage à double vérification ? c'est juste un procédé d'obtention ?
Question n°2
Est-ce que #B (expression lambda) est thread safe ?
Question n°3
J'ai donc fait des recherches sur ce sujet "race-to-initialize" en regardant un échantillon :
volatile Expensive _expensive;
public Expensive Expensive
{
get
{
if (_expensive == null)
{
var instance = new Expensive();
Interlocked.CompareExchange (ref _expensive, instance, null);
}
return _expensive;
}
}
et puis j'ai pensé : la course à l'initialisation n'est-elle pas thread safe ?
e/g/ si 2 fils se retrouvent dans :
l'objet coûteux sera créé deux fois !
Donc encore une fois, 3 questions
1)pourquoi #A dit qu'il implémente le verrouillage à double vérification ? c'est juste un procédé d'obtention ?
2)Est-ce que #B (expression lambda) est thread safe ?
3) La course à l'initialisation n'est pas un thread safe.