Шаблоны проектирования | Бросьте вызов шаблону Singleton (8)

Java задняя часть Шаблоны проектирования
Шаблоны проектирования | Бросьте вызов шаблону Singleton (8)

Это 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();
    }
​

Сначала мы дважды получаем экземпляр объекта в основном потоке, а затем открываем два подпотока для получения экземпляра объекта. Результат работы следующий.

thread.png

Очевидно, что синглтоны на уровне потоков действительно достигнуты. В паттерне singleton, который мы реализовали выше, для обеспечения безопасности потоков мы управляем им через механизм блокировки.ThreadLocalПринцип реализации заключается в том, что все объекты помещаются вThreadLocalMapВ , объект предоставляется для каждого потока, а стратегия «пространство-время» реализует изоляцию между потоками.

11. Резюме

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