Java 非阻塞同步器?

Java 非阻塞同步器?,java,concurrency,synchronization,nonblocking,Java,Concurrency,Synchronization,Nonblocking,Java中有“非阻塞锁”这样的东西吗?我的意思是,有没有一种方法可以保留同步的属性(原子保护和内存可见性-后者可能会在以后出现,但第一个是我现在正在寻找的最重要的东西),但也有多个线程不必等待对象的监视 我要找的不是CAS操作,而是synchronized关键字的实现,或者,它的工作原理类似于,但实际的同步语义不会阻止线程执行某些操作,如调用getter和setter。我想不出任何内置的东西 但您可以使用来确定是否可以获取锁并执行同步操作,或者如果无法获取锁,则执行非同步操作 Lock l =

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


我要找的不是CAS操作,而是
synchronized
关键字的实现,或者,它的工作原理类似于,但实际的同步语义不会阻止线程执行某些操作,如调用getter和setter。

我想不出任何内置的东西

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

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样式的方法调用执行原子复合操作


如果争论是个问题,我建议阅读。如果你正在深入挖掘,快速搜索应该会出现一些其他链接

synchronized
旨在保护关键部分。如果没有关键部分,请不要使用
synchronized
。您的问题在术语上存在矛盾。如果您想要“同步的属性”,阻塞就是其中之一。可能您正在寻找
volatile?
@EJP请重新阅读问题。我把“但是”加粗和大写是有原因的:)它在术语上仍然是矛盾的。如何在不阻塞的情况下“保护代码块”呢?除了我想问你在说什么。您需要定义“受保护”、“执行中的安全”等的含义。Oops错误锁定;-)刚刚在另一个帖子中对此进行了一场大辩论,所以我有点喜欢触发。当我们无法获得锁时会发生什么?我们的代码没有受到保护,我们需要采取其他措施。我提到了“synchronized的语义”,在说我将保证执行的安全性时,除非代码死锁,糟糕的设计造成不准确的结果,等等…@xTrollxDudex啊,我误解了这个问题。正如你现在提出的问题,我认为没有CAS是不可能的。谢谢你的意见。现在有2个答案说不可能。也许我没有澄清我自己-我正在寻找一种保护代码块(即get/set调用)的非阻塞锁定的实现-不是为了避免使用
synchronized
关键字。@xTrollxDudex并发系统是同步关键字的可伸缩版本。我的两种方法仍然用于保护代码块。然而,如果您正在寻找一个单一的构造,它可以让您在保护代码的同时也可以对相同的数据调用getter/setter,那么现在就没有构造了,我们有一个真正的答案:不可能。如果我错了,请纠正我。