Multithreading Scala中对象级别的Val和线程安全
在我正在查看的现有代码库中偶然发现以下代码。还有其他类似的调用将值设置为myService’等。确认以下部分不是线程安全的,因为myService不是本地的,两个线程同时进入createUser并调用myService.newUser会损坏后续的persona.firstName和persona.lastName等。这是理解吗对吗Multithreading Scala中对象级别的Val和线程安全,multithreading,scala,Multithreading,Scala,在我正在查看的现有代码库中偶然发现以下代码。还有其他类似的调用将值设置为myService’等。确认以下部分不是线程安全的,因为myService不是本地的,两个线程同时进入createUser并调用myService.newUser会损坏后续的persona.firstName和persona.lastName等。这是理解吗对吗 object WFService { lazy private val myService = engine.getMyService def cre
object WFService {
lazy private val myService = engine.getMyService
def createUser(persona: Persona): String = {
val user = myService.newUser(persona.id.toString)
persona.firstName.map(n => user.setFirstName(n))
persona.lastName.map(n => user.setLastName(n))
它是val成员,所以我假设它只能有一个对齐。第二个应该返回错误 正如前面提到的,Scala中的lazy val是线程安全的。请参阅:
它是val成员,因此我假设它只能有一个对齐。第二个应该返回错误 正如前面提到的,Scala中的lazy val是线程安全的。请参阅:
Scala中的惰性VAL是线程安全的[1]。您不必担心来自不同线程的多个调用会导致RHS执行两次 因为您有一个对象,所以您也只有一个WFService实例
[1] Scala中的惰性VAL是线程安全的[1]。您不必担心来自不同线程的多个调用会导致RHS执行两次 因为您有一个对象,所以您也只有一个WFService实例
[1] 它是val成员,因此我假设它只能有一条路线。第二个应该返回错误。它是val成员,所以我假设它只能有一个对齐。第二个应该返回错误。因此,如果它是val而不是lazy val,那么它仍然是线程安全的,因为对象的主体是作为构造函数执行的,正如您所说,它是一个单例。因此,如果它是val而不是lazy val,那么它仍然是线程安全的,因为对象的主体是作为构造函数执行的,正如您所说,它是一个单体。