2011-11-10 3 views
3

これらの2回のアトミック操作である:原子とは何ですか?

int value = 5; 
Object obj = new Object(); 

しかし、メソッドのパラメータとしてプリミティブを使用している場合、これはアトミック操作として考えられるであろう: ​​

? オブジェクト参照のコピーは、読み込みと書き込みを含んでいるためアトミックではありません。

オブジェクト参照にアトミック操作を行うための唯一の方法は次のように、それはnullを宣言したり、それに新しいオブジェクトを割り当てることであると言うことは正しいでしょう:

Object obj = null; 

Object obj = new Object(); 

答えて

4

上記のメソッドのパラメータがオブジェクトへの参照であった場合、 操作はアトミックではないでしょうか?

一般にこれは正しいです。親指の良いルールは、さえのようなプリミティブで、まったくアトミックがない考慮することである。

int b,c; 
int a = ++b - c; 

だけプリミティブが、全体の割り当ては、潜在的なアトミックではありません。

あなたがアトミック操作をenshure必要がある場合はdiferent posibilities持っている:

  • synchronizedブロック
  • 不変オブジェクト
  • 固有のライブラリ(は、java.util.concurrent.atomic)
+0

あなたの答えをありがとう!私は自分の質問を編集したので、メソッド呼び出しでオブジェクト参照を使用するときのコード例が含まれています。 – Rox

0
public synchronized void setValue(int val, Object obj) 

今、関数全体が「原子」で、Javaで使われていない用語です

1

To the JLS!

スレッドが変数の値を使用する場合、それが取得する値は、実際にそのスレッドによって、またはいくつかの他のスレッドによって変数に格納された値です。これは、プログラムに適切な同期のためのコードが含まれていなくても当てはまります。たとえば、2つのスレッドが異なるオブジェクトへの参照を同じ参照値に格納する場合、変数には後であるオブジェクトまたは他のオブジェクトへの参照が含まれ、他のオブジェクトへの参照や破損した参照値は参照されません。

したがって、割り当てはアトミックです。

3

スレッドがプリミティブ(longおよびdoubleを除く)またはオブジェクト参照の値を読み取るとき、この変数に設定した値、またはこの変数に別のスレッドが設定した値が表示されます。

ただし、あるスレッドの共有変数に値を割り当てることはアトミックですが、これは他のすべてのスレッドが直後に新しい値を参照することを意味しません。そのためには、変数をvolatile宣言する必要があります。 volatileはlong型とdouble型のアトミックにも書き込みを行います。私はこの場合、AtomicXxx(AtomicLong、AtomicBooleanなど)を使用するほうが好きです。

2つの共有変数の値をアトミックに変更する場合は、一意のロックを使用してこれらの変数へのすべてのアクセス(読み取りと書き込み)を同期する必要があります。

また、「チェックして行動する」または「読み取りして書き込みを行う」操作はすべて非アトミックです。これは、これらの操作にも同期が必要であることを意味します。

質問のすべての操作はアトミックです。しかし、setValue()には、2つのアトミック操作があります。 setValue全体の呼び出しはアトミックではありません。

+0

「ハプンズ・ビフォア」の関係を言わせていただきありがとうございます。 – dmeister

関連する問題