Это разные концепции.
Спин-блокировка, смещенная блокировка и т. Д. c. являются именами алгоритмов / структур для реализации механизма блокировки (мьютекса).
В терминологии HotSpot смещенная блокировка, легкая (тонкая) блокировка и тяжелая (раздутая) блокировка являются возможными состояниями Java intrinsi c монитор, т.е. объект Java, который можно синхронизировать с помощью ключевого слова synchronized
.
В разные моменты времени один и тот же монитор Java может находиться в разных состояниях, например
- При первой попытке блокировки объект смещен на определенный поток.
- Позже, когда другой поток получает блокировку, смещение отменяется, и Монитор успешно восстановлен с помощью простого CAS - это будет блокировка thin .
- Наконец, когда другой поток пытается получить доступ к заблокированному монитору, блокировка равна inflated .
ReentrantLock
- это класс Java, который реализует семантику мьютекса независимо от Java intrinsi c мониторов. То есть термины смещенные , тонкие и раздутые не относятся к ReentrantLock
.
В то же время ReentrantLock
Реализация также имеет несколько разных путей. В простом случае, когда нет споров, получение ReentrantLock
является вопросом единого CAS. В случае, утверждали ReentrantLock
включает в очередь ожидания и вызовы park
для переключения текущего потока от RUNNABLE
до WAITING
состояния. В этом смысле механизм напоминает тонкие и раздутые замки JVM. Но опять же: поскольку ReentrantLock
не является монитором instrinsi c, сравнивать его с легкими и тяжелыми замками JVM не совсем корректно.