gpt4 book ai didi

java - 使用 Actors 而不是 `synchronized`

转载 作者:太空狗 更新时间:2023-10-29 22:56:56 26 4
gpt4 key购买 nike

每次我读到有关在 Scala 中使用 synchronized 时,作者通常会提到应该使用 Actors(例如 this)。虽然我大致了解 actors 是如何工作的,但我真的很想看到一个使用 actors 来替换 Java 的 synchronized 方法修饰符的示例(我指的是它的 Scala 等价物 - synchronized block )在一段代码中。例如,修改数据结构的内部结构会很不错。

这是对 Actors 的良好使用还是我被误导了?

最佳答案

1) 概述

Scala Actors 可以替代标准 Java 线程应用程序中的复杂业务逻辑,这通常会避开开发人员在复杂的多线程系统上工作。

考虑以下 java 代码片段,人们可能会在一个简单的线程应用程序中看到它(此代码正在等待异步请求完成)。

myAsyncRequest.startCalculation(); 
while(notDone)
myAsyncRequest.checkIfDone();
Thread.sleep(1000);
System.out.println("Done ! Value is : " + myAsyncRequest.getCalculationValue());

要查看使用 Scala 的高级并发模型直接替换此类代码,请查看此帖子:Scala program exiting before the execution and completion of all Scala Actor messages being sent. How to stop this?

2) 现在:回到代码 snpipet --- 这里有一些明显的问题,让我们快速看一下:

  • 代码将“监控”计算执行的逻辑与计算结果的处理相结合。
  • 代码 (Thread.sleep(1000)) 中嵌入了启发式算法,没有明确的逻辑依据(为什么等一下?为什么不等 3 秒?),从而向代码块添加了不必要的逻辑。
  • 它无法扩展 - 如果我运行 1000 个客户端,并且每个客户端都在不断检查结果,我可能会产生一些非常丑陋的流量 --- 没有充分的理由。

scala 如何修改这种范式?

  • Scala actor 可以返回“futures”

这些封装了您希望 Actor 完成的“事情”很快就会完成的期望。 Scala“ future ”取代了这个 Java 构造:它使“明确”的事实是,我的 while 循环“期待”在不久的将来发生某事,并且之后有一个 Action 要完成。

  • Scala actors 可以传递“消息”

虽然我正在“等待”(在上面的 while 循环中)完成,但显然另一种实现方式是计算对象在完成时简单地“告诉我”。消息传递可以实现这一点,但有点复杂,并且在某些 Java 实现中会导致无法追踪、不可读的代码。由于 scala 以一种直接设计用于适应并发工作负载的方式抽象了这个概念,消息传递设计模式现在可以以一种不太复杂的方式实现,从而将“等待”的逻辑与逻辑分离的处理。

3) 简短的回答:一般来说,scala API 的构建是为了在更高的抽象层次上对并发逻辑进行编码,因此您的并发代码是声明性的,而不是混杂在实现细节中.

4) 同步:一个较低级别的概念,虽然必不可少,但会使我们的代码复杂化。

同步是底层多线程编程的产物。通过提供最常见的并行编程范例的更高级别的抽象,Scala 使得在许多最常见的并发编程用户案例中不需要这种特殊的构造。事实上,如今,即使是 java 也这样做 :) java.util.concurrent 包为我们提供了原子数据类型和数据结构,避免了将简单操作包装在“同步” block 中的需要。但是,标准 Java 不支持更高级别的“Actor”和“Future”概念,这些概念可以在无需手动管理同步方法调用或对象修改的情况下进行有效管理和协调。

关于java - 使用 Actors 而不是 `synchronized`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8215878/

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