Интервью locksupport.park () выпустит блокировку ресурсов?

Java

park_thread

(Горизонтальный экран мобильного телефона более удобен)

Введение

Как вы все знаете, я недавно набирал людей. Сегодня я встретил одноклассника. Я прочитал кое-что из его исходного кода, а затем начал серию вопросов AQS.

Я: Расскажите мне об общем процессе AQS?

Он: AQS содержит переменную состояния, очередь синхронизации... балабалу... балабалу мьютекс, балабалу разделяемую блокировку...

Я: Помимо очередей синхронизации, какие еще очереди есть в AQS?

Он: Есть еще Условие, и в Условии есть очередь условий...

I: В чем разница между очередями условий и синхронными очередями?

Он: Условная очередь balabala, затем вызовите LockSupport.park(), чтобы заснуть, ожидая пробуждения,..., balabala

Эй, в это время меня внезапно осенило: в чем разница между LockSupport.park() и Thread.sleep()?

Он: Thread.sleep() не освобождает ресурсы блокировки, ..., балабала

Я: Будет ли LockSupport.park() освобождать ресурсы блокировки?

Он: Да. (По оценкам, его путают с Object.wait())

我:会吗? Не могли бы вы? Не могли бы вы?

Он (застенчиво опустил голову): брат Тонг, я не знаю, это не было написано в вашей статье. (Это то, что я писал вслепую ^^)

Хорошо, сегодня мы увидим, освободит ли LockSupport.park() ресурсы блокировки.

Разница между Thread.sleep() и Object.wait()

Прежде всего, давайте посмотрим на разницу между Thread.sleep() и Object.wait() Это плохая тема, и каждый должен уметь сказать два момента.

(1) Thread.sleep() не освобождает занятую блокировку, а Object.wait() снимает занятую блокировку;

(2) Thread.sleep() должен передать время, Object.wait() может быть передан или нет, а отсутствие прохода означает блокировку все время;

(3) Thread.sleep() автоматически проснется, когда время истечет, а затем продолжит выполнение;

(4) Если Object.wait() не требует времени, другой поток должен использовать Object.notify() для пробуждения;

(5) У Object.wait() есть время. Если он не уведомлен, он автоматически проснется, когда придет время. На данный момент есть два случая. Первый — блокировка получена немедленно, и поток продолжится. для выполнения естественным образом, другой заключается в том, что нет немедленного получения блокировки, поток входит в очередь синхронизации и ждет, чтобы получить блокировку;

Фактически, самая большая разница между ними заключается в том, что Thread.sleep() не освобождает ресурсы блокировки, а Object.wait() освобождает ресурсы блокировки.

Разница между Thread.sleep() и Condition.await()

Давайте посмотрим на разницу между Thread.sleep() и Condition.await().

На самом деле, эта тема похожа на предыдущую тему, потому что принципы Object.wait() и Condition.await() аналогичны Вы можете обратиться к «Жизненный цикл потоков в серии Dead Java Thread», написанной Brother Тонг пред.

Ответ на этот вопрос в основном такой же, как и у Object.wait(), разница в том, что нижний слой Condition.await() вызывает LockSupport.park() для блокировки текущего потока.

На самом деле, перед тем, как заблокировать текущий поток, он также сделал две вещи: один — добавить текущий поток в очередь с условием, второй — «полное» снятие блокировки, так что это состояние является переменной состояния, равной 0, а затем вызов LockSupport .park () блокирует текущий поток, прежде чем вы сможете сослаться Тонг брат написал: "Sike ReentrantLock разрешить исходный код Java синхронный ряд (два) - условия блокировки" в этой статье.

Видя это, есть ли ответ на вопрос, поставленный в начале сегодняшней статьи?

Разница между Thread.sleep() и LockSupport.park()

LockSupport.park() также имеет несколько родственных методов — parkNanos(), parkUtil() и т. д. Метод park(), о котором мы здесь говорим, в совокупности относится к этому типу методов.

(1) Функционально методы Thread.sleep() и LockSupport.park() похожи тем, что они блокируют выполнение текущего потока ине освобождает ресурсы блокировки, занятые текущим потоком;

(2) thread.sleep() не может проснуться извне, вы можете только проснуться;

(3) Метод LockSupport.park() может быть активирован другим потоком, вызвавшим метод LockSupport.unpark();

(4) InterruptedException выбрасывается в объявлении метода Thread.sleep(), поэтому вызывающая сторона должна перехватить это исключение или выдать его снова;

(5) Методу LockSupport.park() не нужно перехватывать исключения прерывания;

(6) Thread.sleep() сам по себе является нативным методом;

(7) Нижний слой LockSupport.park() — это родной вызываемый метод Unsafe;

Разница между Object.wait() и LockSupport.park()

Оба блокируют работу текущего потока, в чем разница между ними? После приведенного выше анализа я считаю, что вы должны быть очень ясны, действительно? Посмотри!

(1) Метод Object.wait() должен выполняться в синхронизированном блоке;

(2) LockSupport.park() может выполняться где угодно;

(3) Метод Object.wait() объявляет, что выброшено исключение прерывания, и вызывающая сторона должна перехватить его или снова выдать;

(4) LockSupport.park() не нужно захватывать исключения прерывания [Эта статья была первоначально создана общедоступным ведомым номером «Tong Ge Reading Source Code»];

(5) Если Object.wait() не имеет тайм-аута, другой поток должен выполнить notify(), чтобы проснуться, но он не обязательно продолжает выполнять последующее содержимое;

(6) Если LockSupport.park() не имеет тайм-аута, другой поток должен выполнить unpark(), чтобы проснуться, и он продолжит выполнение последующего содержимого;

(7)Что делать, если notify() выполняется до ожидания()? Выдает исключение IllegalMonitorStateException;

(8)Что делать, если unpark() выполняется до park()? Поток не будет заблокирован, пропустите функцию park() и продолжите выполнение последующего содержимого;

Вы пропустили последние два пункта? !

На самом деле, метод unpark() упоминался в комментариях к коду в статье "Серия мертвых потоков Java: самостоятельное создание пула потоков (продолжение)". Если он выполняется первым, то последующий метод park() выполняться не будет. , работа снова.

Основополагающий принцип park()/unpark() таков:бинарный семафор", вы можете думать об этом как о семафоре только с одной лицензией, за исключением того, что этот семафор не будет увеличивать лицензию при повторном выполнении unpark(), и имеется не более одной лицензии.

Содержимое семафоров можно найти в статье «Анализ исходного кода семафоров из мертвой серии синхронизации Java».

Будет ли LockSupport.park() освобождать ресурсы блокировки?

Нет, он отвечает только за блокировку текущего потока, а освобождение ресурсов блокировки реализовано в методе await() класса Condition.

пасхальные яйца

Что ж, выше мы сравнили различия между Thread.sleep(), Object.wait(), Condition.await() и LockSupport.park().

Давайте завершим сегодняшнее содержание ментальной картой.

park_thread

Добро пожаловать, чтобы обратить внимание на мою общедоступную учетную запись «Брат Тонг читает исходный код», просмотреть больше статей в серии исходного кода и поплавать в океане исходного кода с братом Тонгом.

qrcode