Является ли ReentrantLock легкий замок weight - PullRequest
1 голос
/ 04 апреля 2020

Как известно, HotSpot VM имеет блокировку смещения, спин-блокировку, облегченную блокировку, усиленную блокировку и т. Д. , И ReentrantLock реализован с помощью AbstractQueuedSynchronizer (AQS)。 Так что ReentrantLock - это облегченная блокировка в JVM?

1 Ответ

2 голосов
/ 06 апреля 2020

Это разные концепции.

Спин-блокировка, смещенная блокировка и т. Д. c. являются именами алгоритмов / структур для реализации механизма блокировки (мьютекса).

В терминологии HotSpot смещенная блокировка, легкая (тонкая) блокировка и тяжелая (раздутая) блокировка являются возможными состояниями Java intrinsi c монитор, т.е. объект Java, который можно синхронизировать с помощью ключевого слова synchronized.

В разные моменты времени один и тот же монитор Java может находиться в разных состояниях, например

  1. При первой попытке блокировки объект смещен на определенный поток.
  2. Позже, когда другой поток получает блокировку, смещение отменяется, и Монитор успешно восстановлен с помощью простого CAS - это будет блокировка thin .
  3. Наконец, когда другой поток пытается получить доступ к заблокированному монитору, блокировка равна inflated .

ReentrantLock - это класс Java, который реализует семантику мьютекса независимо от Java intrinsi c мониторов. То есть термины смещенные , тонкие и раздутые не относятся к ReentrantLock.

В то же время ReentrantLock Реализация также имеет несколько разных путей. В простом случае, когда нет споров, получение ReentrantLock является вопросом единого CAS. В случае, утверждали ReentrantLock включает в очередь ожидания и вызовы park для переключения текущего потока от RUNNABLE до WAITING состояния. В этом смысле механизм напоминает тонкие и раздутые замки JVM. Но опять же: поскольку ReentrantLock не является монитором instrinsi c, сравнивать его с легкими и тяжелыми замками JVM не совсем корректно.

...