我正在研究通过多个对象实现基于哈希码的原子锁定的类。主要目的是在所有必需的锁定可用后立即取消服务员线程,从而减少整体等待时间。
它的lockAndGet(List objects)
返回一个涉及所有列出对象的“复合锁”。调用者完成工作后,调用unlock()
。
主要组件是: 1)公共锁定表 - int[]
数组,显示现在持有哪些锁; 2)服务员线程的deque。
算法非常简单:
lockAndGet()
时,它被标记为停放,然后创建包含此线程的状态LOCKED
的新服务器对象并添加到该线程的尾部队列,在此之后调用makeRound()
方法; makeRound()
从头部开始穿过双性人,试图找到哪些服务员可以获得他们的锁。当找到一个这样的服务员时,更新锁定表,将服务员状态更改为UNLOCKED
并从双端队列中删除,服务员的线程被取消停放。遍历后,如果当前线程标记为停车,则将其停放; unlock()
时,会更新锁定表状态并调用makeRound()
。这里,为了避免竞争条件,必须通过更新服务员状态来原子地执行锁定表状态的更新。现在,它通过公共独占Lock
上的同步来实现,并且它运行良好,但我想使用CAS操作以自由锁定的方式实现类似的机制,使服务器队列无锁。步骤1非常简单,但步骤2有问题。
由于Java不支持DCAS,有没有人知道如何 可以实现更新队列节点(更改服务员状态和标记删除)原子地更新其他对象(锁定表),仅使用CAS?我不要求代码,只是提供一些可能有用的提示或方法。
答案 0 :(得分:1)
您可以尝试使用可用的CAS实现多字CAS,但这取决于您为实现此目的而愿意采取多少性能影响。
你可以看看哈里斯' http://www.cl.cam.ac.uk/research/srg/netos/papers/2002-casn.pdf