1. Голодный синглтон в китайском стиле
Скопируйте код кода следующим образом:
публичный класс Синглтон {
частный окончательный статический синглтон INSTANCE = новый синглтон ();
частный синглтон() { }
общественный статический синглтон getInstance() {
вернуть ЭКЗЕМПЛЯР;
}
}
2. С помощью внутренних классов
Это ленивый синглтон, поскольку механизм Java предусматривает, что внутренний класс SingletonHolder будет загружен (реализован лениво) только тогда, когда метод getInstance() вызывается в первый раз, а процесс его загрузки является потокобезопасным. Экземпляр создается один раз при загрузке внутреннего класса.
Скопируйте код кода следующим образом:
публичный класс Синглтон {
частный синглтон() { }
частный статический класс SingletonHolder {
частный окончательный статический синглтон INSTANCE = новый синглтон();
}
общественный статический синглтон getInstance() {
вернуть SingletonHolder.INSTANCE;
}
}
3. Обычное запирающее решение.
Скопируйте код кода следующим образом:
публичный класс Синглтон {
частный статический экземпляр Singleton = null;
частный синглтон() { }
общедоступный статический синхронизированный синглтон getInstance() {
если (экземпляр == ноль) {
экземпляр = новый Синглтон ();
}
вернуть экземпляр;
}
}
Хотя проблема безопасности потоков решена, каждый поток, вызывающий getInstance, должен быть заблокирован. Мы хотим блокировать только первый вызов getInstance. См. решение по двойному обнаружению ниже.
4. Двойное обнаружение, но обратите внимание на метод записи.
Скопируйте код кода следующим образом:
публичный класс Синглтон {
частный статический экземпляр Singleton = null;
частный синглтон() { }
общественный статический синглтон getInstance() {
если (экземпляр == ноль) {
синхронизированный (Singleton.class) {
Синглтон temp = экземпляр;
если (темп == ноль) {
темп = новый Синглтон ();
экземпляр = температура
}
}
}
вернуть экземпляр;
}
}
Из-за проблемы переупорядочения инструкций ее нельзя записать напрямую следующим образом:
публичный класс Синглтон {
частный статический экземпляр Singleton = null;
частный синглтон() { }
общественный статический синглтон getInstance() {
если (экземпляр == ноль) {
синхронизированный (Singleton.class) {
если (экземпляр == ноль) {
экземпляр = новый Синглтон ();
}
}
}
вернуть экземпляр;
}
}
Но если переменная экземпляра изменена с помощью Летучего, все будет в порядке. Если она изменена с помощью Летучего, это может гарантировать, что соответствующие инструкции экземпляра = new Singleton(); Следующий одноэлементный код также является потоковым. безопасный:
публичный класс Синглтон {
частный статический изменчивый экземпляр Singleton = null;
частный синглтон() { }
общественный статический синглтон getInstance() {
если (экземпляр == ноль) {
синхронизированный (Singleton.class) {
если (экземпляр == ноль) {
экземпляр = новый Синглтон ();
}
}
}
вернуть экземпляр;
}
}