【构建并发程序】6-并发集合(可变集合与不可变集合)


 通过多个线程修改标准库的集合,会导致无法预料数据损坏。标准集合的实现代码中没有使用任何同步机制。
 如果我们不采用保护锁,或者原子变量的话。直接更改集合中的数据值,数据值就会出现问题。

不可变集合

不可变集合使用原子变量更加效率 (因为不可变集合还需要重新赋值)

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代码可以互相转换,且本质上两者所阐述的东西都是一致的)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值