Java中是否存在“非阻塞锁”这样的问题?通过这种方式,我的意思是有一种方法来保留同步的属性(原子保护和内存可见性 - 后者可以在以后出现,但第一个是我现在正在寻找的最重要的东西)但是还有多个线程没有必须等待对象的监视器?
我正在寻找的 - 只是为了清楚 - 不是CAS操作,而是synchronized
关键字或ReentrantLock
的实现,就像Semaphore
一样但具有实际同步语义,不会阻止线程执行某些操作,如调用getter和setter。
答案 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应该会显示其他链接。