2016-04-04 12 views
0

が競合状態になることがあります。私が見ている問題は、メソッド呼び出しとactionWasCompletedへのアトミック呼び出しの間にコンテキスト切り替えが存在する可能性があります。それが本当ならばJavaの競合状態のメソッド呼び出しでアトミックコール

private final AtomicReference<ActionCompleted> actionWasCompleted; 

public void actionWasCompleted(){ 
    actionWasCompleted.compareAndSet(ActionCompleted.INITIAL, ActionCompleted.COMPLETED); 
} 

することは、それは

public void actionWasCompleted(){ 
    synchronized(this){ 
    .... 
    } 
} 

と同じケースではありませんそして、それは、上記のコードと、この

public synchronized void actionWasCompleted(){ 
.... 
} 
+0

重要ですか?コンテキストスイッチは、コールの直前にコンテキストスイッチに相当します。 (また、コンテキストスイッチはマルチスレッドに関する正確な方法ではありません。) – user2357112

+0

同期の最後の2つの変種は等しいです。ジャンプするときにメソッドがロックされます。最後のメソッドは、メソッドを呼び出すときに常にロックされます。 synchronizedブロックを持つバージョンでは、メソッド内のロックされたブロックの前に操作を実行できます。 –

+0

質問は不明です。 '....'はどういう意味ですか?最初のコードスニペットでは、参照変数を1回更新するだけです。それはどのようにレースする予定ですか?ものによって? – Holger

答えて

1
に差がある意味します

には、メソッド呼び出しとactionWasCompletedへのアトミック呼び出しの間にコンテキスト切り替えが存在することがあります。

コンテキストスイッチはいつでも実行できます。

そして、それは上記のコードとコードは同等である。この

差がある意味します。 1つは、ロックが取得される前にもう一方のコンテキストが切り替わる可能性はほとんどなくなります。

暗黙の質問です。 "問題はありますか?"

ロックが取得される前に何かが起こる可能性がありますが、これは予想される動作です。