Оригинал: Miss Sister Taste (идентификатор публичной учетной записи WeChat: xjjdog), добро пожаловать, пожалуйста, сохраните источник для перепечатки.
В мире кодеров никогда не было недостатка в существительных. Если нет, мы заставим несколько. Эти существительные имеют аббревиатуры знаний для вертикальных доменов и абстрактные подразделения для горизонтальных доменов. Одни гладкие и ровные, а другие неясные и непонятные, как запор.
В параллельном программировании Java есть относительно неясный термин, называемый закрытием потока. В прошлых технических обсуждениях люди часто упоминали об этом. Так где же она священна и в чем ее польза?
Если вы будете искать статьи в Интернете, вам будет предложено три варианта.
1) Специальные темы закрыты.
2) Стек закрыт.
3) класс ThreadLocal.
Это знание пробило тот слой оконной бумаги, и содержание на самом деле не сложное. Страшно то, что эти термины действительно ломаются, чтобы их запомнить.
значение?
Все мы знаем, что если переменная используется несколькими потоками, это неизбежно приведет к проблемам с синхронизацией. В дополнение к ключевому слову синхронизации в java представлены различные технологии для решения проблем многопоточной синхронизации, включая ожидание, уведомление, блокировку с повторным входом, AQS и т. д. Такой способ программирования увеличивает сложность программы и делает код подверженным ошибкам.
Если есть какие-то данные, относящиеся только к потоку и невидимые для данных вне потока, то код лучше написать. Технология, которая достигает этого эффекта, называется ограничением потока.
Это предпосылка. Далее смотрим на реализацию.
закрытие стека
Закрытие стека относится к категории концепции принуждения, оно фактически невидимо для человека, который пишет код, это поведение по умолчанию стека виртуальной машины или стека нативных методов в JVM. На самом деле, мы давно знаем этот результат: переменные-члены совместно используются потоками, а локальные переменные связаны с потоками.
Очень простая истина, но лежащий в ее основе принцип требует глубокого понимания JVM. Чтобы понять эту функцию, нам нужно иметь предварительное представление о разделении области памяти JVM.
В дополнение к куче с самым большим пространством для хранения, JVM также имеет работающий стек, связанный с потоками. Закрытие стека относится к поведению стека, связанного с потоком.
Давайте немного вспомним разделение памяти на рисунке выше.Замыкание стека относится к области памяти, связанной с потоком в цветной части рисунка.Мы также можем копнуть немного глубже.
Базовые данные в стеке виртуальной машины на самом деле называются кадром стека. Вы можете думать о кадре стека как о выполнении метода.
После помещения каждого метода в стек появляются таблицы локальных переменных, стеки операндов, динамические соединения, адреса возврата и другая информация. Наши локальные переменные действительно существуют в этих местах. Из-за своих предков они в конечном итоге указывают только на один поток, поэтому их область видимости закрыта.
Как показано на рисунке выше, связь между локальными переменными и потоком. В java тоже есть модель JMM памяти выполнения потоков, но это репликация и синхронизация переменных, что не одно и то же.ThreadLocal
На самом деле единственный API закрытия потока, предоставляемый java разработчикам, — это ThreadLocal.
В классе Thread есть переменная-членthreadLocals
, в котором хранится вся пользовательская информация, связанная с этим потоком. Определение этой переменной находится в Thread, а операция — в классе ThreadLocal.
public T get() {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
...
}
ThreadLocalMap getMap(Thread t) {
return t.threadLocals;
}
Существует множество применений ThreadLocal, например, часто используемые, каждый поток генерирует небезопасный поток.SimpleDateFormat
.
ThreadLocal<SimpleDateFormat> sdf = new ThreadLocal<SimpleDateFormat>();
sdf.set(new SimpleDateFormat());
Я не буду слишком много рассказывать о ThreadLocal, просто проверьте исходный код jdk, чтобы получить все бонусы.
Ad-hoc
Большая часть этой информации взята из книги "Java Concurrent Programming". я специально искалAd-hoc
значение имени.
Режим Ad-hoc аналогичен предыдущей концепции витой пары с прямым подключением, которая представляет собой соединение P2P, поэтому он не может обмениваться данными с узлами в других сетях, уменьшая помехи. Как прилагательное в английском языке оно имеет значение «особый» и «временный».
Я действительно не могу понять, почему используется такое имя.
Этот метод полностью контролируется реализатором, поэтому он очень хрупок.
Ну вроде бы честный и практичный ThreadLocal.End
Давайте посмотрим на судьбу этих трех путей. Один из них — внутренняя реализация JVM, знание принципа; Ad-hoc — сказать пользователю, что такое закрытие потока очень сложно, и быстро сдаться; в итоге у нас в нашем распоряжении только ThreadLocal Руки.
Кажется, я вижу, как ThreadLocal манит победой, и в то же время в моем словаре существительных есть еще несколько: закрытие потока, закрытие стека, Ad-hoc.
Об авторе:Мисс сестра вкус(xjjdog), публичная учетная запись, которая не позволяет программистам идти в обход. Сосредоточьтесь на инфраструктуре и Linux. Десять лет архитектуры, десятки миллиардов ежедневного трафика, обсуждение с вами мира высокой параллелизма, дающие вам другой вкус. Мой личный WeChat xjjdog0, добро пожаловать в друзья для дальнейшего общения.