Ну, нет никакой двойной проверки блокировки для производительности. Это паттерна .
Оставляя эмоции в стороне, volatile
здесь, потому что без него к тому времени, когда второй поток проходит instance == null
, первая нить не может построить new Singleton()
все же: никто не обещает, что создание объекта происходит до присваивания instance
для любого потока, кроме фактически создающего объект.
volatile
в свою очередь устанавливает происходит до отношения между чтением и записью и исправляет разбитый шаблон.
Если вы ищете производительность, используйте вместо этого внутренний статический класс.