首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >非阻塞和阻塞并发

非阻塞和阻塞并发
EN

Stack Overflow用户
提问于 2017-03-01 07:30:39
回答 3查看 908关注 0票数 2

据我所知--例如在java中--当我们使用lockssynchronizedconcurrentMapsatomic等时。我们使用的是blocking并发,因为线程在释放锁之前不能继续执行。基本上它使用mutual exclusion

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

什么是用于java并发的non-blocking构造?如果在访问相同资源的情况下,它们依赖于mutual exclusion,那么为什么要调用non-blocking

那么,用于并发的non blocking工具在java中有哪些呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-03-01 07:45:38

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

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

这几乎让你一路顺风。不幸的是,仍然有一些用例,比如生产者-消费者场景、网络通信和I/O,在一般情况下,您无法避免“等待”某些东西。

不过,最酷的是,您仍然可以使用延续来编写没有块的代码。在Java中,这基本上是java.util.concurrent.CompletableFuture。诀窍是,您不编写顺序代码,而是编写如果生产者“准备好”应该发生的事情。这样,您就不会阻塞任何线程,并且您的应用程序是无阻塞的。

因此,与其:

代码语言:javascript
运行
复制
Item item = itemProducer.poll(); // <- blocks
consumer.consume(item);

你做了:

代码语言:javascript
运行
复制
CompletableFuture<Item> itemFuture = itemProducer.get();
itemFuture.thenApply(consumer);

或短:

代码语言:javascript
运行
复制
itemProducer().get().thenApply(consumer);
票数 5
EN

Stack Overflow用户

发布于 2017-03-01 07:48:20

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

来自Javadoc

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

票数 1
EN

Stack Overflow用户

发布于 2017-03-01 07:49:22

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42525700

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档