Statické Inicializátory a synchronizace závit (NET)

hlasů
1

Statické inicializátory mají být proveden jednou před prvním odkazem na třídu. To znamená, že pokaždé, když třída je přístupná, kontrola by měla být provedena, zda statické inicializátory pro třídu jsou provedeny.
Zdá se, že ve vícevláknových tříd prostředí s non-triviální statických Inicializátory může být zdrojem sváru, protože synchronizace nezbytné, pokud je třída přistupovat více vláken.
Moje otázka je, co je nejlepší způsob, jak minimalizovat dopad těchto implicitních zámků na definic tříd zavedených statických Inicializátory?

Položena 25/06/2009 v 18:25
zdroj uživatelem
V jiných jazycích...                            


4 odpovědí

hlasů
1

Nemyslím si, že tam je hodně tvrzení. Tyto Inicializátory jsou spouštěny při načtení třídy. V případě, že třída je již načten pak žádné kontroly muset dojít.

Odpovězeno 25/06/2009 v 18:28
zdroj uživatelem

hlasů
0

Specifikace říká „popraven za dobu realizace-závislý před prvním použitím statického pole této třídy.“.

Takže lze předpokládat (nebo doufat, že pokud jste pesimistické), že provádění přišel na to, že je třeba se starat o synchronizaci vláken.

Odpovězeno 25/06/2009 v 18:59
zdroj uživatelem

hlasů
0

Věřím, že to funguje jako součást JIT kompilace. Jakmile je statický inicializátor byl jitted a běh, to již není třeba jej spustit a tedy žádné problémy synchronizace s více vlákny. A samozřejmě JIT motor bude thread-safe.

Nick.

Odpovězeno 24/07/2009 v 15:30
zdroj uživatelem

hlasů
1

Provedení statického konstruktoru se spouští první nastat v rámci aplikační domény z následujících událostí:

  • vytvoření instance třídy.
  • Jedno ze statické členy třídy jsou označeny

Mělo by být odpovědností zavaděčem tříd zvládnout problémy souběžnosti při volání statické konstruktérů.

Odpovězeno 10/08/2009 v 16:43
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more