繁体   English   中英

无阻塞同步器?

[英]Non-blocking synchronizers?

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

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

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

但您可以使用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.
}

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM