Java中有"非阻塞锁"这样的东西吗?我的意思是,有没有一种方法可以保留同步的属性(原子保护和内存可见性-后者可以稍后出现,但第一个是我现在正在寻找的最重要的东西(,但也可以让多个线程不必等待对象的监视器?
我要寻找的并不是CAS操作,而是synchronized
关键字或ReentrantLock
的实现,它的工作方式类似于Semaphore
but,具有实际的同步语义,不会阻止线程执行某些操作,如调用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风格的方法调用来执行原子复合操作。
如果争论是问题所在,我建议阅读这篇文章。如果你想更深入地挖掘,快速谷歌搜索应该会发现一些其他链接。