Spec-Zone .ru
спецификации, руководства, описания, API
|
В программировании атомарное действие является тем, которое эффективно происходит внезапно. В середине не может остановиться атомарное действие: это или происходит полностью, или это не происходит вообще. Никакие побочные эффекты атомарного действия не видимы, пока действие не полно.
Мы уже видели что выражение инкремента, такой как c++
, не описывает атомарное действие. Даже очень простые выражения могут определить сложные действия, которые могут разложиться в другие действия. Однако, есть действия, можно определить, что являются атомарными:
long
и double
).volatile
(включая long
и double
переменные).Атомарные действия не могут быть чередованы, таким образом, они могут использоваться без страха перед интерференцией потока. Однако, это не избавляет от всей необходимости синхронизировать атомарные действия, потому что ошибки непротиворечивости памяти все еще возможны. Используя volatile
переменные уменьшают риск ошибок непротиворечивости памяти, потому что любая запись к a volatile
переменная устанавливает происхождение - перед отношением с последующими чтениями той же самой переменной. Это означает что изменения для a volatile
переменная всегда видима к другим потокам. К тому же, это также означает это, когда поток читает a volatile
переменная, это видит не только последнее изменение к volatile
, но также и побочные эффекты кода, который привел изменение.
Используя простой атомарный переменный доступ более эффективно чем доступ к этим переменным через синхронизируемый код, но требует, чтобы больше заботы программистом избежало ошибок непротиворечивости памяти. Стоит ли дополнительное усилие, зависит от размера и сложности приложения.
Некоторые из классов в java.util.concurrent
пакет обеспечивает атомарные методы, которые не полагаются на синхронизацию. Мы обсудим их в разделе по Высокоуровневым Объектам Параллелизма.