doskonały artykułPowiel możliwe:
Is the C# static constructor thread safe?Inicjalizacja statyczna gwarantuje bezpieczeństwo pojedynczej nici? (C#)
Jon Skeet pod adresem http://csharpindepth.com/Articles/General/Singleton.aspx i inne artykuły czytałem jasno, że zamek double-check nie działa w zarówno C#, jak i Java, chyba że jednoznacznie oznaczy instancję jako "lotną". Jeśli tego nie zrobisz, sprawdzenie porównania z wartością null może zwrócić false, nawet jeśli konstruktor instancji nie został jeszcze uruchomiony. W trzeciej próbie pana Skeeta stwierdza to wyraźnie: "Model pamięci Java nie zapewnia, że konstruktor zakończy pracę, zanim odwołanie do nowego obiektu zostanie przypisane do instancji. Model pamięci Java przeszedł ponowną obróbkę dla wersji 1.5, ale dwukrotnie -blok kontrolny jest nadal łamany po tym bez zmiennej lotnej (jak w C#) "
Jednak większość się zgadza (w tym Pan Skeet, w próbkach czwartych i piątych w swoim artykule), że użycie statycznej inicjalizacji jest prosty sposób na uzyskanie instancji singleton wątku. Stwierdza on, że "konstruktory statyczne w języku C# są określone do wykonania tylko wtedy, gdy instancja klasy jest tworzona lub odwołuje się do elementu statycznego, i do wykonania tylko raz dla każdej AppDomain."
Ma to sens, ale brakuje czegoś, co oznacza, że odniesienie do nowego obiektu jest przypisane dopiero po zakończeniu konstruktora - w przeciwnym razie uzyskalibyśmy ten sam problem, który powoduje, że podwójne sprawdzanie blokowania kończy się niepowodzeniem, chyba że oznaczysz instancję jako niestabilną. Czy istnieje gwarancja, że podczas korzystania z inicjalizacji statycznej do wywołania konstruktora instancji (w przeciwieństwie do wywoływania konstruktora instancji z get {} obiektu, tak jak robimy to z blokadą double-check), konstruktor w pełni zakończy działanie przed dowolnym innym wątkiem można uzyskać odwołanie do obiektu?
Dzięki!
(odpowiedział na komentarz) –