1. ホーム

[解決済み】プログラミングにおける「atomic」の意味とは?

2022-03-28 11:34:53

質問

Effective Javaの本には、次のように書かれています。

言語仕様では の型でない限り、アトミックです。 long または double [JLS, 17.4.7].

Javaプログラミング、あるいは一般的なプログラミングの文脈で、quot;atomic"とはどのような意味でしょうか?

どのように解決するのですか?

ここで例を挙げてみましょう。仮に foo は、変数型 long であれば、次の操作はアトミック操作ではない( Javaでは ):

foo = 65465498L;

最初の32ビットを書き込む処理と、最後の32ビットを書き込む処理の2つである。つまり、他のスレッドが foo で、その中間状態を見ることができます。

操作をアトミックにすることは、他のどのスレッドからも、その操作が単一のアトミックな(つまり分割できない)操作として見えるようにするために、同期メカニズムを使用することです。つまり、他のどのスレッドからも、いったん操作がアトミックになると foo 代入前、または代入後。しかし、決してその中間値ではありません。

これを実現する簡単な方法として 変数が揮発する :

private volatile long foo;

あるいは、変数へのアクセスごとに同期をとること。

public synchronized void setFoo(long value) {
    this.foo = value;
}

public synchronized long getFoo() {
    return this.foo;
}
// no other use of foo outside of these two methods, unless also synchronized

に置き換えることもできます。 AtomicLong :

private AtomicLong foo;