我的课程从 ConcurrentHashmap[String,immutable.List[String]] 扩展
它有两种方法:
def addEntry(key: String, newList: immutable.List[String]) = {
...
//if key exist,appending the newList to the exist one
//otherwise set the newList as the value
}
def resetEntry(key: String): Unit = {
this.remove(key)
}
为了使 addEntry 方法线程安全,我尝试了:
this.get(key).synchronized{
//append or set here
}
但是如果 key 不存在会引发空指针异常,并且在同步之前使用 putIfAbsent(key, new immutable.List()) 将不起作用,因为在 putIfAbsent 和之前进入同步块之后,key 可能会被 resetEntry 删除。
使 addEntry 和 resetEntry 都同步方法可以工作,但锁太大
那么,我能做些什么呢?
ps.这篇文章与如何在 ConcurrentHashMap 线程安全中更新 BigDecimal类似,同时请帮助我弄清楚如何编写除一般指南之外的代码
--update-- checkout https://stackoverflow.com/a/34309186/404145,在将近 3 年后解决了这个问题。