2013-04-22 5 views
-2

Я знаю, почему использовать синхронизацию в Java, но я не могу найти ответ на этот вопрос:Atomic операция в JAVA

do I need to synchronized an atomic operation? 

Если да, то почему?

+3

Если вы знаете, почему использовать синхронизацию на Java, вы должны быть в состоянии ответить на собственный вопрос. Подумайте, что означает, что операция является атомарной. –

ответ

4

Если это действительно атомный, то нет.

Для обеспечения согласованного состояния необходима синхронизация. Любая атомная операция приводит к состоянию cohernt по определению атомарного.

2

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

Подробнее: http://docs.oracle.com/javase/tutorial/essential/concurrency/atomic.html

3

Есть очень мало действительно атомарные операции в Java. Из Atomic Access Java Tutorial:

  • чтения и записи являются атомарными для ссылочных переменных и для большинства исходных переменных (всех типов, кроме long и double).
  • Считывает и записывает атомы для всех переменных, объявленных volatile (включаяlong10 и double переменных).

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