据我所知--例如在java中--当我们使用locks、synchronized、concurrentMaps、atomic等时。我们使用的是blocking并发,因为线程在释放锁之前不能继续执行。基本上它使用mutual exclusion。
但是,在non-blocking并发中,我们假设不使用mutual exclusion,并保证每个线程的进度,只要它们不争夺相同的资源。但如果他们需要同样的资源,他们似乎又变成了blocking。我说的对吗?
什么是用于java并发的non-blocking构造?如果在访问相同资源的情况下,它们依赖于mutual exclusion,那么为什么要调用non-blocking?
那么,用于并发的non blocking工具在java中有哪些呢?
发布于 2017-03-01 07:45:38
non-blocking代码最简单的形式就是避免锁定或同步。实际上这能让你走得很远。
如果您使用其他线程也使用的一些资源(共享内存),则可以使用一些java.util.concurrent类。如果您查看API文档,有些文档会避免阻塞以支持或放松某些需求。通常只保证eventual consistency,而不是立即/原子更改。
这几乎让你一路顺风。不幸的是,仍然有一些用例,比如生产者-消费者场景、网络通信和I/O,在一般情况下,您无法避免“等待”某些东西。
不过,最酷的是,您仍然可以使用延续来编写没有块的代码。在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);发布于 2017-03-01 07:48:20
java.util.concurrent.atomic类是构成Java中某些非阻塞数据结构的基础的原语。
来自Javadoc:
原子类主要是作为实现非阻塞数据结构和相关基础结构类的构建块设计的。compareAndSet方法不是锁定的通用替代方法。它仅在对象的关键更新仅限于单个变量时应用。
发布于 2017-03-01 07:49:22
AtomicXXX应该是非阻塞/无锁的。
https://stackoverflow.com/questions/42525700
复制相似问题