私はクラス -、更新は、次に表示されますか?
private AtomicLong count = new AtomicLong(0);
にこのような何かをやっている場合は、その後、メソッド内で、私はAtomicLong
が@ThreadSafe
私はクラス -、更新は、次に表示されますか?
private AtomicLong count = new AtomicLong(0);
にこのような何かをやっている場合は、その後、メソッド内で、私はAtomicLong
が@ThreadSafe
あるので、私は混乱していますthis-
count = new AtomicLong(1); // will this update is going to be visible to other threads
ます」完全にAtomicLong
のポイントを逃している。
AtomicLong
は、スレッドセーフな方法でそれを操作するための方法を提供します。新しいインスタンスを使用してインスタンスを置き換える
はそれらのすべてをバイパスします。
あなたはそれを防ぐために、すべてのAtomicLong
変数final
を行う必要があります。
また、同じ値を2回読み込まないようにする必要があります。これは、他のスレッドが読み取り間に値を変更する可能性があるためです。スレッドセーフコードの詳細についてはmy blog postを参照してください。
私はAtomicLong
は、スレッドセーフですなぜあなたは誤解だと思います。スレッドセーフであるということは、そのメソッドを呼び出すときに外部同期が必要ないことを意味します。言い換えれば、すべてのスレッドは、そこに格納されているlong変数の正しい値を参照します。
new
演算子を使用すると、そのクラスの新しいインスタンスが作成されるため、あるスレッドが最初の宣言の値を参照し、別のスレッドが新しい値を参照する可能性があります。
インスタンスを破棄して新しいインスタンスを作成する場合、インスタンスがスレッドの安全性をどのように保証することができますか?実際には、これはクラスを保証するものではありません。あなたはインスタンスを変更しているので
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)
をこのようにインスタンスので、スレッドの安全性を維持します。