Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Actors而不是synchronized`_Java_Scala_Programming Languages_Concurrency_Actor - Fatal编程技术网

Java 使用Actors而不是synchronized`

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线程应用程序中的复杂业务逻辑,而这些应用程序通常会逃避开发

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

这是对演员的良好利用还是我被误导了?

1)概述

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

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

要使用Scala的更高级别并发模型直接替换此类代码,请查看以下帖子:

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

  • 代码将“监控”计算执行的逻辑与计算结果的处理相耦合
  • 代码(Thread.sleep(1000))中嵌入了一些启发式算法,它们没有明确的逻辑理由(为什么要等待一秒钟?为什么不等待3秒钟?),因此向代码块添加了不必要的逻辑
  • 它不能扩展——如果我运行1000个客户端,并且每个客户端都在不断地检查结果,我可能会产生一些非常糟糕的流量——没有什么好的理由
scala如何修改这个范例

  • Scala演员可以回归“未来”
这些概括了这样一种期望:很快,你希望一个演员做的“事情”就会完成。scala“future”取代了这个java构造:它使while循环“预期”在不久的将来会发生一些事情这一事实“显式”化,并在之后执行一个操作

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

3)简单回答:一般来说,scala API的构建是为了在更高的抽象级别上对并发逻辑进行编码,因此并发代码是声明性的,而不是混乱的实现细节。

4)同步:一个较低级别的概念,虽然很重要,但会使代码复杂化。


同步是低级多线程编程的产物。通过提供最常见并行编程范例的更高级别抽象,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());