gpt4 book ai didi

multithreading - 具有多线程的 Scala 单例对象

转载 作者:行者123 更新时间:2023-12-04 14:01:18 25 4
gpt4 key购买 nike

使用 play ,我的 Controller 调用 Foo服务,一个 对象 .这个对象,它使用 val的和 immutable data structures只会被多个客户端调用。

当我的 Controller 调用 Foo.doQuery()在多个线程中,会发生什么?

如果客户端 1 发出执行 Foo.doQuery() 的调用, 将客户 2 的调用转至 Foo.doQuery()必须等待?

我很好奇我是否应该简单地为 Foo 的每个实例创建一个新类,但我想知道 Scala 单例会发生什么,使用 val仅在多线程环境中。

最佳答案

不,Scala 对象并不意味着锁定(Java 中的“同步”),因此客户端 2 不必等待。如果您没有明确地向代码添加锁,客户端 1、客户端 2 和客户端 n 都可以同时运行。

考虑到

object MyObject { ... }

作为
class MyClass(..) { ... }
lazy val MyObject = new MyClass(..)

可以使用“同步”功能应用锁定,如下所示:
def doQuery = synchronized {
..
..
}

== 编辑 ==

至于您在评论中的问题,线程(或调用)堆栈和变量共享与您使用不可变引用和/或不可变数据结构的 Controller 无关。重要的是你在哪里定义你的变量。如果您在方法(方法变量)中定义了一个变量,无论是 val 还是 var,那么每次调用该方法时,都会为调用线程创建该变量。另一方面,如果您在类或对象级别(实例变量)定义变量,则对实例方法的所有调用始终共享相同的实例变量。

在您的情况下,我认为您可以将您的 Controller 实现为单例对象,因为不可变引用和数据结构很好......不可变。它们是否共享并不重要。

关于multithreading - 具有多线程的 Scala 单例对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19934176/

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