【发布时间】:2013-06-12 00:01:33
【问题描述】:
我有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 = //....
}
【问题讨论】:
-
您的代码无法编译。你在使用不可变的地图吗?那么
myData必须是var。无论如何,答案是“不”。您需要一个锁或使用任何其他并发工具,如原子 CAS。 -
@0__ 看看我的更新,现在至少应该可以编译了。
-
您想在那里使用路径复制(使
MyClass本身成为一个不可变的案例类),如 Petr Pudlák 的回答所示。然后你将同步责任转移到使用MyClass的实例上(你可以再次提问:) -
@0__ 嗯,你是对的......如果我理解正确的话。
-
@0__ 你介意给我一个你所说的例子吗(
move the synchronization responsibility to the instance that uses MyClass)?我不确定我是否理解这个问题。
标签: java multithreading scala