TGViewer
Android under the hood Android under the hood @android_under_the_hood · 1.53K subscribers
Post #107 2.5K
Как устроены LockSupport.park() и LockSupport.unpark() под капотом.

В предыдущем посте я показал механизм приостановки потоков на основе такой штуки как LockSupport, но не рассказал как на самом деле устроен этот механизм.

Покопавшись в исходниках JVM я выяснил что методы LockSupport.park() и LockSupport.unpark() под капотом обращаются к следующим системным вызовам Linux:

void Parker::park(...) {
// специальный системный вызов который приостанавливает поток и ждет пока не будет вызван сигнал
pthread_cond_wait(...)
}

void Parker::unpark() {
// сигнал который снова возобновляет выполнение потока
pthread_cond_signal(...)
}


Оба вызова принимают на вход мьютекс, который захватывается когда поток был возобновлен и освобождается когда поток был приостановлен, это дополнительная синхронизация для кода который должен быть атомарно выполнен до приостановки или после возобновления потока.

По итогу происходит вызов планировщика процессов Linux, который либо исключает поток из планирования (pthread_cond_wait), это значит что CPU не будет его выполнять, либо обратно добавляет в очередь планирования (pthread_cond_signal), где поток будет получать определенное количество времени от CPU для своего исполнения.

P.S. В прошлом году я опубликовал статью на Github'е о том как приостанавливается жизненный цикл в Android, так вот, там используется другой системный вызов, он называется epoll, главное его отличие в том что он реагирует на операции ввода-вывода, а не на сигналы.

Всем хорошего кода!
  • 🔥 19
  • 🤣 3
More from @android_under_the_hood
  1. Oct 4, 2026Всем привет, хочу поделиться проектом, который запустил 1 октября — ЗдесьЯ. Это цифровая с…
  2. Oct 2, 2026Kotlin lambdas, часть I. До версии Kotlin 2.0 лямбды компилировались в анонимные классы, р…
  3. Sep 27, 2026Делегат свойства в Kotlin. В Kotlin есть конструкция, которой нет в JVM: var name by NameD…
  4. Sep 23, 2026val vs var под капотом. На уровне Kotlin все просто: val x = 10 var y = 20 y = 30 // компи…
  5. Sep 20, 2026Возвращение Прошло уже полгода с последней записи на канале. За это время в моей жизни про…
  6. Feb 5, 2026Пару фактов о Go, часть II. 4) Вместо Kotlin Nullability указатели как в С/C++, то есть об…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →