Предвзятое решение по блокировке
Я пытаюсь понять причину предвзятого блокирования и сделать его по умолчанию. С прочтением этого поста в блоге, а именно:
"Поскольку большинство объектов заблокированы не более чем одним потоком за время их жизни, мы разрешаем этому потоку смещать объект к себе"
Я озадачен... Зачем кому-то разрабатывать синхронизированный набор методов, к которому должен обращаться только один поток? В большинстве случаев люди разрабатывают определенные строительные блоки специально для многопоточного варианта использования, а не однопоточного. В таких случаях КАЖДЫЙ захват блокировки потоком, который не смещен, за счет безопасной точки, которая является огромными накладными расходами! Может ли кто-нибудь помочь мне понять, что мне не хватает на этой картинке?
2 ответа
Причина, вероятно, в том, что существует приличное количество библиотек и классов, разработанных для обеспечения безопасности потоков, но которые все еще полезны вне таких обстоятельств. Это особенно верно для ряда классов, которые предшествуют структуре коллекций. Vector
и это подклассы является хорошим примером. Если вы также считаете, что большинство java-программ не являются многопоточными, то в большинстве случаев лучше использовать смещенную схему блокировки, особенно это касается устаревшего кода, где использование таких классов является обычным явлением.
В некотором смысле вы правы, но бывают случаи, когда это необходимо, поскольку Хольгер очень правильно указывает в своем комментарии. Существует так называемый период отсрочки, когда смещение не выполняется вообще, так что это не так, что это будет происходить постоянно. Как я в последний раз помню, глядя на код, это было 5 seconds
, Чтобы доказать это, вам понадобится библиотека, которая может проверять заголовок Java Object (jol
приходит мне в голову), так как смещенная блокировка удерживается внутри mark word
, Таким образом, только через 5 секунд объект, который ранее удерживал блокировку, будет смещен в направлении той же блокировки.
РЕДАКТИРОВАТЬ
Я хотел написать тест для этого, но похоже, что он уже есть! Вот ссылка для этого