gpt4 book ai didi

java - 非阻塞和阻塞并发

转载 作者:行者123 更新时间:2023-11-30 06:07:03 24 4
gpt4 key购买 nike

据我所知——例如在java中——当我们使用lockssynchronizedconcurrentMaps, atomic 等。我们正在使用 blocking 并发,因为在释放锁之前线程无法继续。基本上它使用互斥

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

非阻塞 并发的java 结构是什么?如果它们依赖于互斥,为什么它们称为非阻塞 在访问相同资源的情况下?

那么 java 中用于并发的非阻塞机制是什么

最佳答案

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

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

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

很酷的是,您仍然可以使用continuations 编写无 block 代码。在 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);

关于java - 非阻塞和阻塞并发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42525700/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com