Кіріспе

Бағдарламалық жасақтауда талап бойынша инициализациялау (конструкторлық үлгі) идиомасы - жалқау жүктелген синглтон. Java-ның барлық нұсқаларында идиома жақсы өнімділікпен статикалық өрістерді қауіпсіз, өте бір мезгілде жалкоо бастауды қамтамасыз етеді. public class Something { private Something {} private static class LazyHolder { static final Something INSTANCE = new Something ; } public static Something getInstance { return LazyHolder. INSTANCE; } } Идиоманың іске асырылуы Java Language Specification (JLS) -де көрсетілгендей Java Virtual Machine (JVM) -де орындалудың инициализациялық фазасына байланысты . Something класы JVM жүктегенде, класс инициализациялаудан өтеді. Сабақтың бастауыштайтын статикалық айнымалылары болмағандықтан, бастауыштайту тривиальді түрде аяқталады. Оның ішіндегі LazyHolder статикалық сынып анықтамасы JVM LazyHolder орындалуы керек деп анықтағанша инициализацияланбайды. LazyHolder статикалық класы тек getInstance статикалық әдісі Something класына шақырылған кезде орындалады, ал бұл бірінші рет JVM жүктеледі және LazyHolder класын бастамалайды. LazyHolder класының инициализациясы сыртқы Something класының (жеке) конструкторын орындау арқылы INSTANCE статикалық айнымалының инициализациялануына әкеледі. Сабақтарды инициализациялау кезеңі JLS-пен бірізді, яғни бір мезгілде емес болуына кепілдік берілгендіктен, жүктеу мен инициализациялау кезінде статикалық getInstance әдісінде қосымша синхрондау талап етілмейді. Бастапқылау кезеңі статикалық айнымалы INSTANCE-ді ретті операцияда жазатындықтан, getInstance-тің барлық келесі бір мезгілде шақырылуы қосымша синхрондау шығынысыз дәл дұрыс басталған INSTANCE-ті қайтарады.

Қақпақтар

Реализация тиімді, синхрондауды үстіртпей, тиімді және ұдайы синхрондауға қарағанда жақсы жұмыс істейтін, бірақ бұл идиомды тек бір нәрсенің құрылымы сәтсіздікке ұшырамайтынына кепілдік берілген кезде ғана қолдануға болады. JVM-нің көпшілігінде, егер Something құрылымы сәтсіз болса, оны сол сынып жүктеушіден бастауды жалғастыруға тырысу NoClassDefFoundError қатесіне әкеледі.