Предвзятое решение по блокировке

Я пытаюсь понять причину предвзятого блокирования и сделать его по умолчанию. С прочтением этого поста в блоге, а именно:

"Поскольку большинство объектов заблокированы не более чем одним потоком за время их жизни, мы разрешаем этому потоку смещать объект к себе"

Я озадачен... Зачем кому-то разрабатывать синхронизированный набор методов, к которому должен обращаться только один поток? В большинстве случаев люди разрабатывают определенные строительные блоки специально для многопоточного варианта использования, а не однопоточного. В таких случаях КАЖДЫЙ захват блокировки потоком, который не смещен, за счет безопасной точки, которая является огромными накладными расходами! Может ли кто-нибудь помочь мне понять, что мне не хватает на этой картинке?

2 ответа

Причина, вероятно, в том, что существует приличное количество библиотек и классов, разработанных для обеспечения безопасности потоков, но которые все еще полезны вне таких обстоятельств. Это особенно верно для ряда классов, которые предшествуют структуре коллекций. Vector и это подклассы является хорошим примером. Если вы также считаете, что большинство java-программ не являются многопоточными, то в большинстве случаев лучше использовать смещенную схему блокировки, особенно это касается устаревшего кода, где использование таких классов является обычным явлением.

В некотором смысле вы правы, но бывают случаи, когда это необходимо, поскольку Хольгер очень правильно указывает в своем комментарии. Существует так называемый период отсрочки, когда смещение не выполняется вообще, так что это не так, что это будет происходить постоянно. Как я в последний раз помню, глядя на код, это было 5 seconds, Чтобы доказать это, вам понадобится библиотека, которая может проверять заголовок Java Object (jol приходит мне в голову), так как смещенная блокировка удерживается внутри mark word, Таким образом, только через 5 секунд объект, который ранее удерживал блокировку, будет смещен в направлении той же блокировки.

РЕДАКТИРОВАТЬ

Я хотел написать тест для этого, но похоже, что он уже есть! Вот ссылка для этого

Другие вопросы по тегам