Idiom držitele inicializace na vyžádání - Initialization-on-demand holder idiom

v softwarové inženýrství, držitel inicializace na vyžádání (návrhový vzor ) idiom je a líný jedináček. Ve všech verzích Javy umožňuje idiom bezpečnou, vysoce souběžnou línou inicializaci statických polí s dobrým výkonem.[1][2]

veřejnost třída Něco {    soukromé Něco() {}    soukromé statický třída LazyHolder {        statický finále Něco INSTANCE = Nový Něco();    }    veřejnost statický Něco getInstance() {        vrátit se LazyHolder.INSTANCE;    }}

Implementace idiomu závisí na inicializační fázi provádění v rámci Virtuální stroj Java (JVM) podle specifikace specifikace jazyka Java (JLS).[3] Když třída Něco je načten JVM, třída prochází inicializací. Protože třída nemá žádné statické proměnné k inicializaci, inicializace se triviálně dokončí. Definice statické třídy LazyHolder uvnitř toho je ne inicializováno, dokud JVM neurčí LazyHolder musí být provedeno. Statická třída LazyHolder se provede pouze při statické metodě getInstance je vyvolán ve třídě Něcoa poprvé k tomu dojde, JVM načte a inicializuje LazyHolder třída. Inicializace LazyHolder výsledky třídy ve statické proměnné INSTANCE je inicializován spuštěním (soukromého) konstruktoru pro vnější třídu Něco. Vzhledem k tomu, že fáze inicializace třídy je zaručena JLS tak, aby byla sekvenční, tj. Nesouběžná, není ve statické části vyžadována žádná další synchronizace getInstance metoda během načítání a inicializace. A protože inicializační fáze zapisuje statickou proměnnou INSTANCE v postupné operaci všechna následující souběžná vyvolání getInstance vrátí stejné správně inicializované INSTANCE aniž by vznikly další režijní náklady na synchronizaci.

Upozornění

Zatímco implementací je efektivní mezipaměť "singleton" bezpečná pro vlákna bez synchronizačních režií a lepšího výkonu než nekontrolovaná synchronizace,[4] idiom lze použít pouze při konstrukci Něco zaručeně nezklame. Ve většině implementací JVM, pokud výstavba Něco selže, následné pokusy o inicializaci ze stejného zavaděče tříd povedou k NoClassDefFoundError selhání.

Viz také

externí odkazy

Reference

  1. ^ The dvakrát zkontrolovaný blokovací idiom nefunguje správně ve verzích Java před 1.5.
  2. ^ INSTANCE by měl být balíček soukromý
  3. ^ Vidět 12.4 specifikace jazyka Java pro detaily.
  4. ^ „Nejrychlejší vlákno bezpečný Singleton v JVM“. literatejava.com.