Java 使用Actors而不是synchronized`
每次我读到有关在Scala中使用Java 使用Actors而不是synchronized`,java,scala,programming-languages,concurrency,actor,Java,Scala,Programming Languages,Concurrency,Actor,每次我读到有关在Scala中使用synchronized的文章时,作者通常会提到应该使用actor(例如)。虽然我大致了解actors是如何工作的,但我真的希望看到一个actors被用来在一段代码中替换Java的synchronized方法修饰符(我指的是它的Scala等价物--synchronized块)的示例。例如,修改数据结构的内部结构会很好 这是对演员的良好利用还是我被误导了?1)概述 Scala Actors可以替代标准Java线程应用程序中的复杂业务逻辑,而这些应用程序通常会逃避开发
synchronized
的文章时,作者通常会提到应该使用actor(例如)。虽然我大致了解actors是如何工作的,但我真的希望看到一个actors被用来在一段代码中替换Java的synchronized
方法修饰符(我指的是它的Scala等价物--synchronized
块)的示例。例如,修改数据结构的内部结构会很好
这是对演员的良好利用还是我被误导了?1)概述
Scala Actors可以替代标准Java线程应用程序中的复杂业务逻辑,而这些应用程序通常会逃避开发人员在复杂多线程系统上的工作
考虑一下在一个简单的线程化应用程序中可能看到的以下java代码片段(此代码正在等待异步请求完成)
要使用Scala的更高级别并发模型直接替换此类代码,请查看以下帖子:
2)现在:回到代码snpipe——这里有一些明显的问题,让我们快速看一下:
- 代码将“监控”计算执行的逻辑与计算结果的处理相耦合李>
- 代码(Thread.sleep(1000))中嵌入了一些启发式算法,它们没有明确的逻辑理由(为什么要等待一秒钟?为什么不等待3秒钟?),因此向代码块添加了不必要的逻辑
- 它不能扩展——如果我运行1000个客户端,并且每个客户端都在不断地检查结果,我可能会产生一些非常糟糕的流量——没有什么好的理由李>
- Scala演员可以回归“未来”
- Scala参与者可以传递“消息”
同步是低级多线程编程的产物。通过提供最常见并行编程范例的更高级别抽象,Scala使得在许多最常见的并发编程用户案例中不需要这种特殊的构造。事实上,如今,甚至java也这样做了:)java.util.concurrent包为我们提供了原子数据类型和数据结构,无需将简单操作包装在“同步”块中。但是,标准Java不支持更高级别的“参与者”和“未来”概念无需手动管理同步的方法调用或对象修改,即可有效地管理和协调。参与者保证一次只处理一条消息,这样就不会有两个线程访问任何实例成员-因此无需使用同步的解释演员,但它并没有真正讨论他们的能力,以消除
同步
关键字.Touche'!我在末尾添加了一个部分。我认为常见的java“synchronized”习惯用法并没有完全被scala所取代——只是scala对并发工作流具有面向对象的包装,从而减少了使用低级并发结构的必要性。。。。另外,请记住,在Scala中可以调用synchronized()方法,该方法同步整个对象。因为actor实际上促进了并发计算。假设我有一个列表来收集硬盘上所有的文件名。我想使用actor范例来实现这个。我的电脑有4个内核,我想actor应该允许我的程序使用所有这4个内核来扫描文件,并将名称放入我的列表中。如果没有同步,actor如何保证一次只处理一个“add”呢?在这种情况下,您可能有两种类型的actor,一种扫描目录并发出带有要添加的名称的消息,另一种接受此类消息并将其添加到列表中(以及提供消息来检索列表。您将拥有一个由第一个实例组成的池,并将工作分配给第二个实例的单个实例。请注意,这是一个过于简单的场景,因此复杂性可能不会太高。在现实世界的场景中,要获得正确的同步是很困难的……有2个实例是有意义的案例的参与者类型。同步实际上由第二个参与者的消息队列(邮箱?)处理,对吗?是。参与者系统负责将消息同步到邮箱中
myAsyncRequest.startCalculation();
while(notDone)
myAsyncRequest.checkIfDone();
Thread.sleep(1000);
System.out.println("Done ! Value is : " + myAsyncRequest.getCalculationValue());