通过多个线程修改标准库的集合,会导致无法预料数据损坏。标准集合的实现代码中没有使用任何同步机制。
如果我们不采用保护锁,或者原子变量的话。直接更改集合中的数据值,数据值就会出现问题。
不可变集合
不可变集合使用原子变量更加效率 (因为不可变集合还需要重新赋值)
class 并发集合_不可变集合与原子变量[T] {
private val buffer = new AtomicReference[List[T]](Nil)
@tailrec final def +=(x: T): Unit = {
val xs: List[T] = buffer.get()
val new_value: List[T] = x :: xs //不可变集合需要赋值
if (!buffer.compareAndSet(xs, new_value)) this.+=(x)
}
}
可变集合
可变集合使用synchronzied更加效率(因为可变集合无需赋值)
object 并发集合_可变集合与保护锁 extends App {
val buffer = scala.collection.mutable.ArrayBuffer[Int]()
def asyncAdd(number: Seq[Int]): Unit = execute {
buffer.synchronized {
buffer ++= number //可变集合无需重新赋值
println(s"buffer = $buffer")
}
}
}
(本文章虽然采用的代码为scala代码,但java代码与Scala代码可以互相转换,且本质上两者所阐述的东西都是一致的)