2016-09-05 9 views

答えて

4

あるので、私は混乱していますthis-

count = new AtomicLong(1); // will this update is going to be visible to other threads 

ます」完全にAtomicLongのポイントを逃している。

AtomicLongは、スレッドセーフな方法でそれを操作するための方法を提供します。新しいインスタンスを使用してインスタンスを置き換える
はそれらのすべてをバイパスします。

あなたはそれを防ぐために、すべてのAtomicLong変数finalを行う必要があります。

また、同じ値を2回読み込まないようにする必要があります。これは、他のスレッドが読み取り間に値を変更する可能性があるためです。スレッドセーフコードの詳細についてはmy blog postを参照してください。

1

私はAtomicLongは、スレッドセーフですなぜあなたは誤解だと思います。スレッドセーフであるということは、そのメソッドを呼び出すときに外部同期が必要ないことを意味します。言い換えれば、すべてのスレッドは、そこに格納されているlong変数の正しい値を参照します。

new演算子を使用すると、そのクラスの新しいインスタンスが作成されるため、あるスレッドが最初の宣言の値を参照し、別のスレッドが新しい値を参照する可能性があります。

2

インスタンスを破棄して新しいインスタンスを作成する場合、インスタンスがスレッドの安全性をどのように保証することができますか?実際には、これはクラスを保証するものではありません。あなたはインスタンスを変更しているので

private AtomicLong count = new Long(0); 
count = new AtomicLong (1); 

private Long count = new Long(0); 
count = new Long(1); 

の間に差がないので

は、実はこれは、スレッドの安全性を中断します。

AtomicLongは、インスタンスを保持する場合にのみスレッドセーフであることが保証されています。したがって、あなただけ行う必要があります。

count.incrementAndGet() 

または

count.set(1) 

をこのようにインスタンスので、スレッドの安全性を維持します。

関連する問題