Помните, что более чем один поток может вызывать getInstance
в данный момент времени.
В примере 1 гарантируется, что инициализатор для члена uniqueInstance
будет выполняться только один раз - во время загрузки класса.
В Примере 2, поскольку инициализация происходит встроенным в getInstance
, более чем один поток может независимо и одновременно найти переменную-член uniqueInstance
равной null
.Затем каждый поток будет вызывать new Singleton()
с неопределенными результатами, которые зависят от синхронизации двух (или более) потоков.
Для работы примера 2 можно (например) добавить synchronized
наgetInstance
method.
Ваш комментарий о том, что переменная полностью инициализирована во время загрузки класса, верен для примера 1, но не для 2 - в примере 2 переменная-член установлена на null
во время загрузки класса, но заполняется экземпляром объекта позже, во время первого вызова (вызовов) до getInstance
.