gpt4 book ai didi

java - Scala 中的多线程——只处理不可变性

转载 作者:搜寻专家 更新时间:2023-11-01 01:44:06 25 4
gpt4 key购买 nike

我有Scala的代码

class MyClass {
private val myData: Map[String, MyClass2] = new HashMap[String, MyClass2]()

def someMethod = {
synchronized(myData) {
val id = getSomeId
if (myData.containsKey(id)) myData = myData.remove(id)
else Log.d("123", "Not found!")
}
}

def getSomeId = //....
}

我想知道,是否可以在不使用 synchronized 的情况下保持此代码线程安全?并且不涉及其他一些库,例如 Akka或任何其他(类)甚至内置在 Java 或 Scala 中?

理想情况下,我只想通过使用不变性的概念(Java 中的 final,如果您愿意的话)来实现线程安全。

更新:

class MyClass(myData: Map[String, MyClass2] = new HashMap[String, MyClass2]()) {

def someMethod = {
synchronized(myData) {
val id = getSomeId
if (myData.containsKey(id)) new MyClass(myData.remove(id))
else {
Log.d("123", "Not found!")
this
}
}
}

def getSomeId = //....
}

最佳答案

只有使 MyClass 也不可变(并且让它也只使用不可变数据结构),才能解决不可变问题。原因很简单:如果 MyClass 是可变的,那么您必须通过并发线程同步修改。

这需要不同的设计 - 每个导致 MyClass 实例“改变”的操作都将返回一个(可能)修改过的实例。

import collection.immutable._

class MyClass2 {
// ...
}

// We can make the default constructor private, if we want to manage the
// map ourselves instead of allowing users to pass arbitrary maps
// (depends on your use case):
class MyClass private (val myData: Map[String,MyClass2]) {
// A public constructor:
def this() = this(new HashMap[String,MyClass2]())

def someMethod(id: String): MyClass = {
if (myData.contains(id))
new MyClass(myData - id) // create a new, updated instance
else {
println("Not found: " + id)
this // no modification, we can return the current
// unmodified instance
}
}

// other methods for adding something to the map
// ...
}

关于java - Scala 中的多线程——只处理不可变性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17123703/

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