不可变的集合(深入的scala书中的一个例子)

时间:2013-05-14 03:28:45

标签: scala concurrency atomic immutability

在本书中,它有以下示例,它只同步插入,但没有同步查找。我知道currentIndex将在插入后指向不同的对象,但是是指向不同对象的操作原子?例如,假设指针是8字节(在64位机器上),那么在某些时候currentIndex将切换指针,但是如果那个开关不是原子的,比如它首先切换前4个字节,然后切换第二个4字节,如果在第一个和第二个开关之间,我们查找数据,那么指向一个对象的指针永远不存在,这将导致问题

class ImmutableService[Key, Value] extends Service[Key, Value] {
   var currentIndex = new ImmutableHashMap[Key,Value]
   def lookUp(k: Key): Option[Value] = currentIndex.get(k)
   def insert(k: Key, v: Value): Unit = synchronized {
       currentIndex = currentIndex + ((k, v))
   }
}

1 个答案:

答案 0 :(得分:0)

是的,currentIndex是一个引用 - 因此对它的更改将以原子方式完成。

检查:

Are 64 bit assignments in Java atomic on a 32 bit machine?