TGViewer
FAANG Master FAANG Master @faangmaster · 2.94K subscribers
Post #177 1.5K
Может ли такой код привести к deadlock?
#java #concurrency

class A {
public synchronized void foo() {
...
}
}

class B extends A {
public synchronized void foo() {
...
super.foo();
}
}

Как мы видим, оба метода foo в классе A и классе B synchronized. Синхронизация в данном случае на одном и том же объекте.
Обычно deadlock возникает в многопоточной среде, когда потоки получают локи на хотя бы двух объектах в разном порядке.
Например,
void foo(Object obj1, Object obj2) {
synchronized(obj1) {
synchronized(obj2) {
....
}
}
}
и один поток вызывает foo(obj1, obj2), а второй поток вызывает foo(obj2, obj1), то может возникнуть deadlock. Т.к. один поток получит лок на один объект и будет ждать получения лока на второй объект. А второй поток наоборот. Получит сначала лок на второй и будет ждать получения лока на первый объект, который держит первый поток.
В данном случае ситуация иная. У нас всего один объект.

Давайте посмотрим, что будет если у нас всего один поток.
Например, у нас такой код B b = new B(); b.foo();
Вызывающий поток получит лок на B при вызове foo из класса B. Далее дойдет до кода super.foo(). Этот вызов тоже synchronized на том же объекте.
Лок на этот объект уже получен вызывающим потоком. И если бы в Java synchronized был бы не reentrant, то поток бы ждал пока лок отпустят, чтобы его получить. В таком случае мог бы возникнуть deadlock. Но в силу того, что в Java synchronized в Java Reentrant один и тот же поток может получить лок на один и тот же объект множество раз. Для каждого такого лока (монитора) есть некий счетчик(сколько раз получен монитор на данный объект) и идентификатор потока, который его получил. Лок может получить только один поток, но множество раз. Как только счетчик упадет до нуля, это значит, что другой поток может получить теперь монитор (лок) на данном объекте.

Поэтому deadlock не возникнет благодаря свойству reentrancy локов при помощи synchronized (intrinsic locks).
  • 👍 14
More from @faangmaster
  1. Sep 13, 2026Навье-Стоксгейт 8 сентября OpenAI заявила, что её невыпущенная модель решила одну из семи…
  2. Sep 3, 2026Uber совместно с британским стартапом Wayve запускает роботакси в Лондоне Пришла нотификац…
  3. Aug 20, 2026Новый HTTP метод QUERY Этим летом в спецификацию HTTP добавили новый метод - QUERY. Добавл…
  4. Aug 15, 2026IOI 2026 В Ташкенте прошел межнар школьников по информатике. Результаты: https://stats.ioi…
  5. Jul 30, 2026В свое время я закончил МФТИ. Относительно непростой вуз для обучения. Закончил неплохо. З…
  6. Jul 18, 2026Документалка про Java В продолжение темы документалок, вышла документалка про Java. Трейле…
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 →