如何以无锁方式自动更新 2 个对象?
How to update 2 objects atomically in a lock-free manner?
我正在研究 class,它通过多个对象实现基于散列码的原子锁定。主要目的是在所有必需的锁可用时立即取消等待程序线程,从而减少总体等待时间。
它是 lockAndGet(List objects)
returns 一个涉及所有列出对象的单个 "composite lock"。调用者完成工作后,调用 unlock()
.
主要组成部分是:1)普通锁table--int[]
显示现在持有哪些锁的数组; 2) 等待线程的双端队列。
算法很简单:
- 当线程调用
lockAndGet()
时,它被标记为停放,然后创建并添加新的 waiter 对象 ,状态 LOCKED
包含此线程到队列的尾部,之后调用 makeRound()
方法;
makeRound()
从头开始遍历双端队列,试图找到哪些等待者可以获得他们的锁。当找到一个这样的服务员时,锁 table 被更新,服务员状态更改为 UNLOCKED
并从双端队列中删除,服务员的线程被取消。遍历后,如果当前线程被标记为parking,则parking;
- 当
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
我正在研究 class,它通过多个对象实现基于散列码的原子锁定。主要目的是在所有必需的锁可用时立即取消等待程序线程,从而减少总体等待时间。
它是 lockAndGet(List objects)
returns 一个涉及所有列出对象的单个 "composite lock"。调用者完成工作后,调用 unlock()
.
主要组成部分是:1)普通锁table--int[]
显示现在持有哪些锁的数组; 2) 等待线程的双端队列。
算法很简单:
- 当线程调用
lockAndGet()
时,它被标记为停放,然后创建并添加新的 waiter 对象 ,状态LOCKED
包含此线程到队列的尾部,之后调用makeRound()
方法; makeRound()
从头开始遍历双端队列,试图找到哪些等待者可以获得他们的锁。当找到一个这样的服务员时,锁 table 被更新,服务员状态更改为UNLOCKED
并从双端队列中删除,服务员的线程被取消。遍历后,如果当前线程被标记为parking,则parking;- 当
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