Singleton pattern (Bill Pugh's solution)

I'm reading wiki about the singleton pattern and I'm not sure if I understand this: https://en.wikipedia.org/wiki/Initialization-on-demand_holder_idiom part of it correctly.

So to make it simple: Why is Bill Pugh's solution better than the example above?

Is it because a static class is not load by the VM before it's actually used or something like this, so we don't create the object before we turn to the getInstance() method? Also is that method thread safe only to the extent of initializing the object?

29
задан Rob Fox 8 December 2016 в 10:34
поделиться

2 ответа

JLS гарантирует, что класс загружается только при первом использовании (что делает инициализацию синглтона ленивой), и что загрузка класса является поточно-ориентированной (что делает метод getInstance() потоком -safe)

Что касается того, почему потокобезопасен

Поскольку в первый раз вызывается getInstance (), JVM будет содержать класс держателя. Если другой поток вызывает getInstance () одновременно, JVM не будет загружать класс держателя второй раз: он будет ждать, пока первый поток завершит загрузку класса, и в конце загрузки и инициализации класса держателя, оба потока увидят, что класс-держатель правильно инициализирован и, таким образом, содержит уникальный экземпляр singleton.

24
ответ дан 28 November 2019 в 01:17
поделиться

Это потому, что статический класс не загружается виртуальной машиной до его фактического использования, или что-то в этом роде, поэтому мы не создаем объект до того, как обратимся к методу getInstance ()?

Правильно.

Кроме того, является ли этот метод безопасным для потока только для степени инициализации объекта?

Он обеспечивает создание только одного экземпляра, и ни один клиент не получает ничего, кроме ссылки на этот полностью инициализированный объект. экземпляры.

1
ответ дан 28 November 2019 в 01:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: