无阻塞同步器



Java中有"非阻塞锁"这样的东西吗?我的意思是,有没有一种方法可以保留同步的属性(原子保护和内存可见性-后者可以稍后出现,但第一个是我现在正在寻找的最重要的东西(,但也可以让多个线程不必等待对象的监视器?

我要寻找的并不是CAS操作,而是synchronized关键字或ReentrantLock的实现,它的工作方式类似于Semaphorebut,具有实际的同步语义,不会阻止线程执行某些操作,如调用getter和setter。

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

您也可以尝试CopyOnWriteArrayList,如果您正在修改数组,则可以创建一个副本,并在修改数组时将其用于任何读取操作。这里的问题是你不能保证得到数据的最新更新

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

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

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

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.
}

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

如果争论是问题所在,我建议阅读这篇文章。如果你想更深入地挖掘,快速谷歌搜索应该会发现一些其他链接。

最新更新