Интервью высокого уровня: закрытая тема, новый термин√

Java Spring

Оригинал: 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, добро пожаловать в друзья для дальнейшего общения.​