AtomicReference 实例使用不安全的 CAS 操作来利用处理器指令进行锁定。但是我有点困惑它在复杂对象的情况下是如何工作的。
例如,假设我有一个 Person 类的实例(id、firstName、lastName)。我将对象实例共享给多个线程 t1、t2 和 t3。由于操作应该是原子的,所以我不会共享 Person 类对象实例,而是将该对象包装到 AtomicReference 实例中并与所有线程共享。
现在线程 t1 只更新 firstName,线程 t2 只更新 lastName,线程 t3 更新 firstName 和 lastName。之后,每个线程都会调用 compareAndSet 方法来反映新的变化。
此外,我正在使用 volatile 引用,以便写入可以发生在主内存中并且对所有线程可见。
我想了解:
在上述情况下,当 compareAndSet 被调用时,Person 类实例的预期值和新值之间会比较哪些内容(例如 id、firstName、lastName)?
假设线程 t1 更新了 firstName 并调用了 compareAndSet。线程 t2 更新了 lastName 并且将调用 compareAndSet。在这种情况下,AtomicReference 如何保证线程 t2 不会删除线程 t1 所做的更改,即更新 firstName?
假设 2 个线程 t1 和 t2 同时调用 compareAndSet,那么谁会赢得比赛,而其他输了的线程会发生什么?