如何以无锁方式自动更新 2 个对象?

How to update 2 objects atomically in a lock-free manner?

我正在研究 class,它通过多个对象实现基于散列码的原子锁定。主要目的是在所有必需的锁可用时立即取消等待程序线程,从而减少总体等待时间。

它是 lockAndGet(List objects) returns 一个涉及所有列出对象的单个 "composite lock"。调用者完成工作后,调用 unlock().

主要组成部分是:1)普通锁table--int[]显示现在持有哪些锁的数组; 2) 等待线程的双端队列。

算法很简单:

  1. 当线程调用 lockAndGet() 时,它被标记为停放,然后创建并添加新的 waiter 对象 ,状态 LOCKED 包含此线程到队列的尾部,之后调用 makeRound() 方法;
  2. makeRound() 从头开始​​遍历双端队列,试图找到哪些等待者可以获得他们的锁。当找到一个这样的服务员时,锁 table 被更新,服务员状态更改为 UNLOCKED 并从双端队列中删除,服务员的线程被取消。遍历后,如果当前线程被标记为parking,则parking;
  3. unlock() 在某些复合锁上调用时,锁 table 状态会更新并调用 makeRound()

这里,为了避免竞争条件,锁状态table的更新必须与服务员的状态更新自动执行。现在,它是通过common exclusive Lock上的同步来实现的,并且效果很好,但是我想使用CAS操作以自由锁的方式实现类似的机制,使等待队列无锁。第1步很简单,但第2步有问题

由于 Java 不支持 DCAS,有谁知道如何 可以实现更新队列节点(改变服务员状态和标记删除)自动更新其他对象(锁定table), 只使用 CAS?我不要求代码,只是一些可能有用的提示或方法。

您可以尝试使用可用的 CAS 实现多词 CAS,但这取决于您愿意为实现此目标而承受多少性能损失。

你可以看看哈里斯的http://www.cl.cam.ac.uk/research/srg/netos/papers/2002-casn.pdf