同步容器类
- Vetor、HashTable
- 同步类容器都是安全的,但是在某些场景下可能需要加锁来保护复合操作
- 这些容器的同步功能都是由JDK的Collections.synchronized***等工厂方法实现的
- 其底层机制是用synchronized关键字对每个公用方法都进行同步,或者使用Objext mutex对象锁的机制使得每次只能由一个线程访问容器的状态。
- 在同步容器中,并发的修改,删除会引起容器的异常
- 不满足互联网对高并发的需求:在线程安全的同时,还能有很好的并发性能。
同步类容器的问题
-
复合类操作如:迭代(反复访问元素,遍历完容器中所有的元素)、跳转(根据指定的顺序找到当前元素的下一个元素)、条件运算(若没有则添加 )。
-
符合操作在多线程并发的修改容器时,可能会表现出意外的行为,最典型的便是CMD,原因是当容器迭代的过程中,被并发的修改了内容,这是由于早期迭代器的设计的时候没有考虑并发的问题。
-
Vetor、HashTable对每个公有方法都进行synchronized同步。而工具类是synchronized和Objext mutex实现的对象锁,每次都只有一个线程能访问容器的状态。
同步容器类工厂方法
将一个普通容器传递进去变为同步类容器
List<String> list = new ArrayList<>();
Collections.synchronizedCollection(list);
使用对象锁
同步容器类根据自身的锁来保护它的每个方法
final Collection<E> c; // Backing Collection
final Object mutex; // Object on which to synchronize
SynchronizedCollection(Collection<E> c) {
this.c = Objects.requireNonNull(c);
mutex = this;
}
public int size() {
synchronized (mutex) {return c.size();}
}
public boolean isEmpty() {
synchronized (mutex) {return c.isEmpty();}
}
//....