Это 31-й день моего участия в августовском испытании обновлений. Узнайте подробности события:Испытание августовского обновления
Содержание продолжается из предыдущей статьи«Вызов одиночного режима (7)», в прошлой статье рассказывалось о самой элегантной реализации синглтона, а именно
enum
Реализация перечисления. Были обсуждены почти все паттерны синглтонов, а в этой статье добавлены блюда для анализа того, как реализовать паттерны синглтонов в рамках потоков.
10. Одноэлементный поток TheadLocal
В приведенной выше статье мы говорили о глобальных синглтонах.Существует множество специальных сценариев, в которых используются синглтоны в области потока, например, для хранения токенов авторизации и так далее.ThreadLocal
По своей сути потокобезопасный.
ThreadLocal
это класс для создания локальных переменных потока. Обычно переменные, которые мы создаем, могут быть доступны и изменены любым потоком. при использованииThreadLocal
Созданная переменная доступна только текущему потоку и не может быть доступна и изменена другими потоками.
Код реализован следующим образом.
public class SingletonInThreadLocal {
private SingletonInThreadLocal (){
}
private static final ThreadLocal<SingletonInThreadLocal> threadLocalInstance =
new ThreadLocal<SingletonInThreadLocal>(){
@Override
protected SingletonInThreadLocal initialValue() {
return new SingletonInThreadLocal();
}
};
public static SingletonInThreadLocal getInstance(){
return threadLocalInstance.get();
}
}
Код очень простой, просто инициализируйтеThreadLocal
, задаватьThreadLocal
Начальное значение обертки, объект экземпляра синглтона. Приложение, которое получает экземпляр объекта внеgetInstance
статический метод доступа.
Затем давайте напишем тестовый метод, чтобы увидеть, можем ли мы получить синглтон на уровне потока?
public static void main(String[] args) {
System.out.println(SingletonInThreadLocal.getInstance());
System.out.println(SingletonInThreadLocal.getInstance());
new Thread(()-> System.out.println(SingletonInThreadLocal.getInstance())).start();
new Thread(()-> System.out.println(SingletonInThreadLocal.getInstance())).start();
}
Сначала мы дважды получаем экземпляр объекта в основном потоке, а затем открываем два подпотока для получения экземпляра объекта. Результат работы следующий.
Очевидно, что синглтоны на уровне потоков действительно достигнуты. В паттерне singleton, который мы реализовали выше, для обеспечения безопасности потоков мы управляем им через механизм блокировки.ThreadLocal
Принцип реализации заключается в том, что все объекты помещаются вThreadLocalMap
В , объект предоставляется для каждого потока, а стратегия «пространство-время» реализует изоляцию между потоками.
11. Резюме
Паттерн синглтон — это паттерн начального уровня в паттерне проектирования.Он выглядит очень просто, но имеет множество подводных камней.В данной статье анализируются различные методы реализации и сценарии применения. Если интересно, студенты могут все это реализовать, кстати, проверить эффективность создания объектов.