非阻塞和阻塞并发

时间:2017-03-01 07:30:39

标签: java concurrency

据我所知 - 例如java - 当我们使用lockssynchronizedconcurrentMapsatomic等。我们正在使用blocking并发,因为在释放锁之前线程无法继续。基本上它使用mutual exclusion

但是在non-blocking并发中,我们假设不使用mutual exclusion并保证每个线程的进度,只要它们不竞争相同的资源。但如果他们需要相同的资源,它们似乎又会变成blocking。我对吗?

java并发的non-blocking构造是什么?如果他们在访问同一资源时依赖non-blocking,为什么会调用mutual exclusion

那么non blocking中的java设施的并发性是什么

3 个答案:

答案 0 :(得分:4)

最简单的non-blocking代码形式是简单地避免锁定或同步。这实际上让你走得很远。

如果您使用其他线程也使用的某些资源(共享内存),则可以使用一些java.util.concurrent类。如果您查看API文档,有些会避免阻止或放宽某些要求。通常只保证eventual consistency而不是立即/原子变化。

这一直让你几乎。不幸的是,仍然存在一些用例,例如生产者 - 消费者场景,网络通信和I / O,在那里你无法真正避免等待"为了某事。

但很酷的是,您仍然可以使用 continuations 编写无块代码。在Java中,这基本上是java.util.concurrent.CompletableFuture。诀窍在于你不会编写顺序代码,而是写下如果生产者准备好了应该发生的事情"。这样,您就不会阻止任何线程,并且您的应用程序是无块的。

所以而不是:

Item item = itemProducer.poll(); // <- blocks
consumer.consume(item);

你这样做:

CompletableFuture<Item> itemFuture = itemProducer.get();
itemFuture.thenApply(consumer);

或简短:

itemProducer().get().thenApply(consumer);

答案 1 :(得分:1)

java.util.concurrent.atomic类是构成Java中某些非阻塞数据结构基础的原语。

来自Javadoc

  

原子类主要是作为实现非阻塞数据结构和相关基础结构类的构建块而设计的。 compareAndSet方法不是锁定的一般替代方法。仅当对象的关键更新仅限于单个变量时,它才适用。

答案 2 :(得分:0)

AtomicXXX应该是非阻塞/无锁定的。