有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使用Actors而不是synchronized`

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

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


共 (2) 个答案

  1. # 1 楼答案

    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)现在:回到代码snpipe——这里有一些明显的问题,让我们快速看一下:

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

    scala如何修改这个范例

    • Scala演员可以回归“未来”

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

    • Scala参与者可以传递“消息”

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

    简而言之,scala API的构建通常是为了在更高的抽象级别上对并发逻辑进行编码,因此并发代码是声明性的,而不是混乱的实现细节

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

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

  2. # 2 楼答案

    Actors保证一次只处理一条消息,这样就不会有两个线程访问任何实例成员——因此无需使用synchronized