什么是同步容器类
- 包括Vector和Hashtable(早期JDK的一部分)
- 由Collections.synchronizedXxx等工厂方法创建的
- 实现方式是:将它们的状态封装起来,并对每个公有方法都进行同步,使得每次只有一个线程能访问容器的状态(下节将看到并发容器不是这么做的)
- 某些情况下需要额外的客户端加锁来保护符合操作
- 迭代(遍历容器中的元素)(书中的例子5-3,5-4)
- 跳转
- 条件运算(若没有则添加)(书中的例子5-1,5-2)
迭代器(Iterator)
- 对容器类进行迭代的标准方法是Iterator
- 如果在迭代期间其他线程并发地修改容器,迭代器的hasNext或者next就会抛出ConcurrentModificationException
- 如果想要避免抛出ConcurrentModificationException,那就要在迭代过程持有容器的锁
- 如果容器规模很大或者每个元素的执行操作时间很长,那长时间地对容器加锁会降低程序的可伸缩性,在锁上的竞争可能越激烈,极大地降低吞吐量和CPU的利用率
- 注意隐藏的迭代操作,比如容器的toString, hashCode和equals方法