2017-01-06 3 views
1

私は1つのAtomicLong変数でマルチスレッド、すべてのスレッド共有とプロセスを実行するプログラムを持っています。それぞれはまずgetAndAdd()メソッドを呼び出して値を取得し、さらに処理します。AtomicLongのgetAndAddメソッドはスレッドを待ちますか?

すべてのスレッドが同時に実行されている場合、上記のメソッドを呼び出すと、あるスレッドが他のスレッドが値を取得するのを待つことになりますか?

答えて

3

スレッドは(Object::waitという意味で)待機しておらず、AtomicLongの取得と追加に成功するまでループしています。参考のため

the code in JDK 8は次のようになります。彼らがループしている方法は、本質的であってもよいこと

public final long getAndAddLong(Object o, long offset, long delta) { 
    long v; 
    do { 
    v = getLongVolatile(o, offset); 
    } while (!compareAndSwapLong(o, offset, v, v + delta)); 
    return v; 
} 

注(すなわち、それは、より効率的な何か、通常、単一のCPU命令によって、実行時に置き換えられる)

+0

彼らは価値を得るまで何もしないだろうという意味ですか? パフォーマンスに影響を与えているのだろうか? –

+0

彼らは何もしません、彼らは100%CPUを使用するように(ビジー待機中)ループします。しかし、それは通常の競合条件では長く続くことはありません。もしあなたのプログラムが何千ものスレッドを持っていて 'getAndAdd'以外の何かをしているのなら、あなたは高いCPU使用率に気付くでしょうが、それは非現実的なシナリオです。 – assylias

+0

参照:http://stackoverflow.com/questions/2664172/java-concurrency-cas-vs-locking – assylias

関連する問題