#c# #java #multithreading #thread-safety
#c# #java #многопоточность #потокобезопасность
Вопрос:
Мне просто интересно, есть ли разница между тем, как вы увеличиваете статическую переменную в Java и C # в потоковой среде?
В Java для выполнения этой операции используется atomic int: s, а в C # — Interlocked.Incement (ссылка на yourVar)
Я имею в виду не код, который вы пишете, а то, как он на самом деле блокирует память и выполняет фактическое увеличение.
Комментарии:
1. Это не вопрос языка. Разные версии или разные реализации, или разные целевые платформы виртуальной машины могут влиять на внутреннее поведение таких функций.
2. На самом деле java ОЧЕНЬ, очень сильно основана на CAS (в самой своей сердцевине), и она также предлагает похожие на CAS примитивы. Таким образом, значение impl: либо LL / CS, либо natural CAS на самом деле не имеет значения. C # использует функцию блокировки WinAPI для реализации. который, если память не изменяет, добавляет префикс w / LOCK.
Ответ №1:
Операция с блокировкой не блокирует память, она скорее передает префикс БЛОКИРОВКИ инструкции в зависимости от операции. Это заставляет процессор устанавливать блокировку шины, поэтому инструкция выполняется только один раз. Вы можете дополнительно ознакомиться с следующей статьей
Комментарии:
1. Ссылка разорвана
Ответ №2:
В случае Java — «как это работает» зависит от набора команд платформы выполнения. Я читал (ранее сегодня, ожидая завершения бесконечного обновления ОС), что на x86 классы AtomicXXX реализованы с использованием инструкции Compare and Swap (CAS).
Комментарии:
1. Да, атомарный материал — это цикл (if (cas) break) в java. Блокировка в C # может быть реализована с помощью добавления БЛОКИРОВКИ.