Zadałeś tutaj tylko jedno pytanie, ale jest kilkanaście pytań, które powinieneś był zadać, więc odpowiem na wszystkie.
Oto kolejność, którą założyłem
- Początek konstruktora klasy (znany również jako
cctor
)
- Koniec cctor
- początek Main
- początek MyMethod
Czy to jest poprawne?
Nie. Prawidłowa kolejność to:
- Początek cctora programu, jeśli taki istnieje. Tam nie ma.
- Koniec cctor dla programu, jeśli taki istnieje. Tam nie ma.
- Początek Main
- Uruchomienie cctora dla MyClass
- Koniec procesora MyClass
- Początek MyClass.MyMethod
A co, jeśli istnieje inicjator pola statycznego?
Środowisko CLR może zmienić kolejność, w jakiej w niektórych przypadkach są uruchamiane inicjatory pól statycznych. Zobacz stronę Jona na ten temat, aby uzyskać szczegółowe informacje:
Różnice między konstruktorami statycznymi a inicjatorami typów
Czy jest kiedykolwiek możliwe, aby metoda statyczna, taka jak, MyMethod
była wywoływana przed zakończeniem działania cctora tej klasy?
Tak. Jeśli sam cctor wywoła MyMethod, wtedy oczywiście MyMethod zostanie wywołana przed zakończeniem cctor.
Moduł cctor nie wywołuje MyMethod. Czy jest możliwe kiedykolwiek MyMethod
wywołanie metody statycznej, takiej jak metoda cctor MyClass?
Tak. Jeśli cctor używa innego typu, którego cctor wywołuje MyMethod, wówczas MyMethod zostanie wywołana przed zakończeniem działania cctor MyClass.
Żaden procesor nie wywołuje MyMethod, bezpośrednio ani pośrednio! Czy jest kiedykolwiek możliwe, aby metoda statyczna, taka jak, MyMethod
była wywoływana przed zakończeniem działania modułu sterującego MyClass?
Nie.
Czy to nadal prawda, nawet jeśli w grę wchodzi wiele wątków?
Tak. Cctor zakończy się na jednym wątku, zanim będzie można wywołać metodę statyczną w dowolnym wątku.
Czy cctor można wywołać więcej niż raz? Załóżmy, że oba wątki powodują uruchomienie cctora.
Gwarantowane jest, że cctor zostanie wywołany najwyżej raz, niezależnie od liczby zaangażowanych wątków. Jeśli dwa wątki wywołują MyMethod „w tym samym czasie”, ścigają się. Jeden z nich przegrywa wyścig i blokuje do czasu, gdy na zwycięskiej nitce nie skończy się kreator MyClass.
Utrata wątku blokuje się, dopóki cctor nie zostanie zakończony? Naprawdę ?
Naprawdę.
A co, jeśli cctor w wątku wygrywającym wywoła kod, który blokuje blokadę poprzednio zajętą przez wątek przegrywający ?
Wtedy mamy klasyczny warunek odwrócenia kolejności blokowania. Twój program jest zakleszczony. Na zawsze.
To wydaje się niebezpieczne. Jak mogę uniknąć impasu?
Jeśli to boli, przestań to robić . Nigdy nie rób czegoś, co może zablokować cctor.
Czy warto polegać na semantyce inicjalizacji cctor w celu wymuszenia złożonych wymagań dotyczących bezpieczeństwa? Czy warto mieć moduł sterujący, który obsługuje interakcje użytkowników?
Nie są też dobre pomysły. Moja rada jest taka, że powinieneś znaleźć inny sposób, aby upewnić się, że warunki wstępne mające wpływ na bezpieczeństwo są spełnione.