无阻塞同步器?

时间:2014-04-29 02:26:47

标签: java concurrency synchronization nonblocking

Java中是否存在“非阻塞锁”这样的问题?通过这种方式,我的意思是有一种方法来保留同步的属性(原子保护和内存可见性 - 后者可以在以后出现,但第一个是我现在正在寻找的最重要的东西)但是还有多个线程没有必须等待对象的监视器?

我正在寻找的 - 只是为了清楚 - 不是CAS操作,而是synchronized关键字或ReentrantLock的实现,就像Semaphore一样具有实际同步语义,不会阻止线程执行某些操作,如调用getter和setter。

3 个答案:

答案 0 :(得分:1)

我想不出任何内置的东西。

但您可以使用tryLock来确定是否可以获取Lock并执行同步操作,或者,如果您无法获取Lock,则执行非同步操作。< / p>

Lock l = ...

if(l.tryLock()) {
    try {
        // do your synchronized action
    } finally {
        l.unlock();
    }
} else {
    // welp, we couldn't get the lock.
    // do some local work.
}

答案 1 :(得分:1)

您可以查看锁定条带技术(在concurrenthashmap中使用)以查看它是否满足您的需求。他们的基本想法是你将你的结构分解成段,如果一个线程正在修改一个段,你仍然可以从其他段读取。

您还可以尝试使用CopyOnWriteArrayList,如果您正在修改数组,则可以在修改数组时创建副本并将其用于任何读取操作。这里的问题是您无法保证获得数据的最新更新

上述两种方法都是用于构建并发系统而不是同步系统。

答案 2 :(得分:0)

与所有答案和OP中的答案一样,我得出结论,使用当前的同步技术是不可能的。最后,我将说明我们不能使用get / set样式方法调用来执行原子复合操作,而不使用阻塞同步器

如果争用是问题,我建议您阅读this article。如果您正在深入挖掘,快速google search应该会显示其他链接。