2013-10-27 4 views
2

Из того, что я понимаю, синхронизированное ключевое слово синхронизирует кеш локального потока с основной памятью. ключевое слово volatile в основном всегда считывает переменную из основной памяти при каждом доступе. Конечно, доступ к основной памяти намного дороже, чем кэш локального потока, поэтому эти операции дороги. Тем не менее, операция CAS использует аппаратные операции низкого уровня, но все же приходится обращаться к основной памяти. Итак, как работает CAS быстрее?Почему операции CAS (Atomic) быстрее, чем синхронизированные или изменчивые операции

+1

Это совсем не то, что делает любое из этих ключевых слов. (особенно 'synchronized') – SLaks

+0

Что такое CAS на Java и что он имеет отношение к многопоточности в java? – UDPLover

+0

@Meraman: http://en.wikipedia.org/wiki/Compare-and-swap – SLaks

ответ

1

Я считаю, что критический фактор, как вы заявляете, - механизмы CAS используют низкоуровневые аппаратные инструкции, которые позволяют минимизировать крах и разрешение конфликтов.

Другие два механизма (synchronization и volatile) используют различные архитектурные трюки, которые более широко доступны для всех разных архитектур.

Инструкции CAS доступны в той или иной форме в большинстве современных архитектур, но в каждой архитектуре будет реализована различная реализация.

Интересная цитата из Brian Goetz (предположительно)

Относительная скорость операций в значительной степени не проблема. Важна разница в масштабируемости между блокирующими и неблокирующими алгоритмами. И если вы работаете в 1 или 2 ядрах, перестаньте думать о таких вещах.

Неблокирующие алгоритмы обычно лучше масштабируются, поскольку они имеют более короткие «критические разделы», чем алгоритмы на основе блокировок.

1

Обратите внимание, что CAS не обязательно должен иметь доступ к памяти.

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

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

Так что никогда не предполагайте, что если вы переключитесь на атомику, все ваши проблемы исчезнут. Большим преимуществом атомистики являются гарантии прогресса для блокировки (кто-то всегда добивается прогресса) или ожидания (все заканчиваются после определенного количества шагов). Тем не менее, это часто ортогонально сырой производительности: решение без ожидания, вероятно, будет значительно медленнее, чем решение на основе блокировки, но в некоторых ситуациях вы готовы принять это, чтобы получить гарантии прогресса.