Требуется ли для получения и снятия блокировок монитора java (синхронизированных блоков, повторных входных блокировок и т. Д. c) переключение контекста в пространство ядра? - PullRequest
2 голосов
/ 05 февраля 2020

AFAIK, у каждого объекта в Java есть слово-метка. Первое слово (слово-метка) используется для хранения информации о блокировке либо через флаг, если только один поток получает блокировку, либо указывает на объект монитора блокировки, если существует конфликт между различными потоками, и в обоих случаях сравнивают и Конструкция swap используется для получения блокировки.

Но по этой ссылке - https://www.baeldung.com/lmax-disruptor-concurrency

Чтобы справиться с конфликтом при записи, очередь часто использует блокировки, которые могут вызвать переключение контекста в ядро. Когда это происходит, процессор может потерять данные в своих кэшах.

Чего мне не хватает?

1 Ответ

4 голосов
/ 05 февраля 2020

Ни synchronized, ни стандартные реализации Lock не требуют переключения контекста в ядре при блокировке без участия или разблокировке. Эти операции действительно сводятся к атомам c cas или write.

Критическим аспектом производительности является конфликт , т. Е. При попытке получить монитор или заблокировать, и он недоступен. Ожидание доступности монитора или блокировки подразумевает перевод потока в состояние ожидания и его повторную активацию, когда ресурс стал доступен. Влияние на производительность настолько велико, что вам вообще не нужно беспокоиться о кэшах процессора.

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

Обратите внимание, что связанная статья говорит перед цитируемым предложением:

Очереди обычно всегда близки к полному или близки к пустому из-за различий в темпах между потребителями и производителями.

В таком сценарии более быстрые потоки будут быстрее или позже введите условие ожидания, ожидая нового пространства или новых элементов в очереди, даже если они получили блокировку без конфликтов. Таким образом, в этом конкретном c сценарии связанные затраты действительно существуют и неизбежны при использовании простой реализации очереди.

...