gpt4 book ai didi

java - 如何以无锁方式原子更新2个对象?

转载 作者:行者123 更新时间:2023-11-30 08:14:18 25 4
gpt4 key购买 nike

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

它的lockAndGet(Listobjects)返回一个涉及所有列出对象的“复合锁”。调用者完成工作后,会调用 unlock()

主要组成部分有: 1)公共(public)锁表——int[]数组,显示现在持有哪些锁; 2) 等待线程的双端队列。

算法非常简单:

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

这里,为了避免竞争条件,锁表状态的更新必须与等待者状态的更新一起原子地执行。现在是通过普通独占Lock上的同步来实现的,效果很好,但我想用CAS操作以自由锁的方式实现类似的机制,使服务员队列无锁。第 1 步非常简单,但第 2 步就有问题。

DCAS Java不支持,有谁知道怎么办仅使用 CAS 可以实现队列节点的更新(服务员状态的更改和删除标记)原子地更新其他对象(锁定表)?我不要求代码,只要求一些可能有帮助的提示或方法。

最佳答案

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

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

关于java - 如何以无锁方式原子更新2个对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29878236/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com