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

时间:2015-04-26 13:27:14

标签: java multithreading atomic lock-free compare-and-swap

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

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

主要组件是: 1)公共锁定表 - int[]数组,显示现在持有哪些锁; 2)服务员线程的deque。

算法非常简单:

  1. 当线程调用lockAndGet()时,它被标记为停放,然后创建包含此线程的状态LOCKED的新服务器对象并添加到该线程的尾部队列,在此之后调用makeRound()方法;
  2. makeRound()从头部开始穿过双性人,试图找到哪些服务员可以获得他们的锁。当找到一个这样的服务员时,更新锁定表,将服务员状态更改为UNLOCKED并从双端队列中删除,服务员的线程被取消停放。遍历后,如果当前线程标记为停车,则将其停放;
  3. 在某些复合锁上调用unlock()时,会更新锁定表状态并调用makeRound()
  4. 这里,为了避免竞争条件,必须通过更新服务员状态来原子地执行锁定表状态的更新。现在,它通过公共独占Lock上的同步来实现,并且它运行良好,但我想使用CAS操作以自由锁定的方式实现类似的机制,使服务器队列无锁。步骤1非常简单,但步骤2有问题。

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

1 个答案:

答案 0 :(得分:1)

您可以尝试使用可用的CAS实现多字CAS,但这取决于您为实现此目的而愿意采取多少性能影响。

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