Ни synchronized
, ни стандартные реализации Lock
не требуют переключения контекста в ядре при блокировке без участия или разблокировке. Эти операции действительно сводятся к атомам c cas или write.
Критическим аспектом производительности является конфликт , т. Е. При попытке получить монитор или заблокировать, и он недоступен. Ожидание доступности монитора или блокировки подразумевает перевод потока в состояние ожидания и его повторную активацию, когда ресурс стал доступен. Влияние на производительность настолько велико, что вам вообще не нужно беспокоиться о кэшах процессора.
По этой причине типичные реализации выполняют некоторое количество вращения, перепроверяя доступность монитора или блокируя все oop на некоторое время, когда есть шанс стать доступным в это время. Обычно это связано с количеством ядер процессора. Когда ресурс становится доступным в это время, этих затрат можно избежать. Это, однако, обычно требует, чтобы приобретение было разрешено быть несправедливым , так как вращающееся приобретение может настигнуть уже ожидающую нить.
Обратите внимание, что связанная статья говорит перед цитируемым предложением:
Очереди обычно всегда близки к полному или близки к пустому из-за различий в темпах между потребителями и производителями.
В таком сценарии более быстрые потоки будут быстрее или позже введите условие ожидания, ожидая нового пространства или новых элементов в очереди, даже если они получили блокировку без конфликтов. Таким образом, в этом конкретном c сценарии связанные затраты действительно существуют и неизбежны при использовании простой реализации очереди.