3
static boolean unsynchronizedSetter(Date expected){
    Date newDate = new Date();
    AtomicReference<Date> myAtomicReference = Lookup.getAtomicRef();
    boolean myStatus = myAtomicReference.compareAndSet(expected, newDate); //CAS
    return myStatus;
}

Q: 2 つのスレッドがそれを実行する場合、どのオブジェクトがアトミック参照に格納されますか?

マルチプロセッサ マシンでは、2 つのスレッドが同じクロック サイクルで CAS を実行できます。どちらも同じ myAtomicReference オブジェクトを使用して CAS を実行し、どちらも正しい値の "expected" を使用していますが、2 つの異なるオブジェクト、つまり 2 つの newDate を入れようとしているとします。そのうちの 1 つが失敗する必要がありますが、そのスレッドで myStatus は false になりますか?

CompareAndSwap の 1 つのハードウェア実装では、更新を行うためにスレッドをキューに入れると思います。2 つのプロセッサが同じクロック サイクルで CAS 命令を実行している場合でも、そのうちの 1 つが遅れている可能性があります。

4

2 に答える 2

1
Q: If 2 threads executes it, which object will get stored in the atomic reference?

誰も知ることができません。javadocによると、そのうちの1つです。

In a multi-processor machine, 2 threads could be performing the CAS in the same clock cycle.

私の知る限り、現在の Intel/AMD マルチコア CPU 用のグローバル クロックはありません。

One of them must fail, but will myStatus be false in that thread?

そうでなければ、成功したことを意味し、 java.util.concurrent 全体がバラバラになります。myStatus両方が同じオブジェクトをそこに置こうとしたとしても、1 つのスレッドでは false でなければならないことは確かです。

I guess one hardware implementation of CompareAndSwap would make the threads queue up to do their updates.

「キューアップ」とは言いません (これは OS によって行われるように聞こえます)。CAS 命令はハードウェアによって遅延されます。

于 2011-03-28T20:13:34.257 に答える
1

入力していただきありがとうございます。元の質問者として、私は両方のスレッドで可能性があると感じていますmyStatus == true。これは、以下の私自身の質問に対する暫定的な回答です。

"One of them must fail, but will myStatus be false in that thread?"

私見ですが、両方のスレッドがそれぞれのnewDateオブジェクトを入れることに成功したと「考える」ことが考えられます。myStatusただし、最初のスレッドは、CAS 操作の直後、その変数がずっと信頼できないことを認識している必要があります。myStatus が true になる可能性があるため信頼できませんが、AtomicReference を読み取ると、その値が変更されている可能性があります。共有 AtomicReference は、任意のスレッドによっていつでも変更される可能性があります。この AtomicReference インスタンスは、同期構造によって保護されていません。

myStatus==trueは、このスレッドが の値を正しく推測したことを意味するだけなexpectedので、JVM は正しい推測に対して約束された賞をスレッドに与える必要があります。ただし、JVM は newDate を AtomicReference 内に保持しません。したがって、その「賞」を獲得しても意味がありません。

これが意味をなすことを願っています。

于 2011-03-30T01:17:52.403 に答える