1. Есть ли недостаток в вышеописанной реализации getInstance
метод?
Это не работает. Вы можете получить несколько экземпляров синглтона.
2.В чем разница между двумя реализациями ??1008*
Второй работает, но требует синхронизации, которая может замедлить работу системы, когда у вас много обращений к методу из разных потоков.
Самая простая и правильная реализация:
public class MySingleton{
private static final MySingleton _instance = new MySingleton();
private MySingleton(){}
public static MySingleton getInstance() {
return _instance;
}
}
Короче и лучше (безопасно сериализуемый):
public enum MySingleton{
INSTANCE;
// methods go here
}
Ленивая инициализация синглетонов - это тема, которая привлекает внимание образом несоразмерно с ее фактической практической полезностью (IMO, спорящая о тонкостях двойной проверки блокировки, к которой ваш пример является первым шагом ничего, кроме конкурса писающих).
В 99% случаев вам вообще не нужна ленивая инициализация, или «init, когда класс впервые упоминается» в Java достаточно хорош. В оставшихся 1% случаев это лучшее решение:
public enum MySingleton{
private MySingleton(){}
private static class Holder {
static final MySingleton instance = new MySingleton();
}
static MySingleton getInstance() { return Holder.instance; }
}