天天看点

Java并发编程实践笔记之—同步容器类(Synchronized Collections)

什么是同步容器类

  • 包括Vector和Hashtable(早期JDK的一部分)
  • 由Collections.synchronizedXxx等工厂方法创建的
  • 实现方式是:将它们的状态封装起来,并对每个公有方法都进行同步,使得每次只有一个线程能访问容器的状态(下节将看到并发容器不是这么做的)
  • 某些情况下需要额外的客户端加锁来保护符合操作
    1. 迭代(遍历容器中的元素)(书中的例子5-3,5-4)
    2. 跳转
    3. 条件运算(若没有则添加)(书中的例子5-1,5-2)

迭代器(Iterator)

  • 对容器类进行迭代的标准方法是Iterator
  • 如果在迭代期间其他线程并发地修改容器,迭代器的hasNext或者next就会抛出ConcurrentModificationException
  • 如果想要避免抛出ConcurrentModificationException,那就要在迭代过程持有容器的锁
  • 如果容器规模很大或者每个元素的执行操作时间很长,那长时间地对容器加锁会降低程序的可伸缩性,在锁上的竞争可能越激烈,极大地降低吞吐量和CPU的利用率
  • 注意隐藏的迭代操作,比如容器的toString, hashCode和equals方法