Java并发学习之同步容器类
很多神秘的东西其实早已存在,只要我们善于寻找。-----Hacker Dore
Java平台类库包含了丰富的并发基础构建模块,例如线程安全的容器类以及用于各种协调多个相互协作的线程控制流的同步工具类。
一.同步容器类
Java中的普通容器包uitl中的同步容器类有:Vector,Hashtable,Stack。
我们还可以通过Collections类来获得相应的安全的容器类:这些类实现线程安全的方式是将它们的状态封装起来,并对每个公有方法都进行同步,使得每一次只有一个线程能访问容器的状态。
1.同步容器类的问题
同步容器类虽然都是安全的,但在某些情况下可能需要额外的客户端加锁来保护复合操作。
常见的复合操作有:迭代(遍历容器完中所有元素) ,跳转(根据指定顺序找到当前元素的下一个元素),条件运算(例如:若没有则添加)。
在同步容器类中,这些复合的操作在没有客户端加锁的情况下是线程安全的,但是当多个线程并发地从外部修改容器时,可能会发生不安全的现象。
例如:下面代码给出Vector中定义两个方法
public static Object getLast(Vector list){
int lastIndex==list.size()-1;
return list.get(lastIndex);
}
public static void deleteLast(Vector list){
int lastIndex=list.size()-1;
list.remove(lastIndex);
}
上面的两个方法在Vector类中的安全性是没有问题的,但是如果我们有两个线程同时分别调用这两个方法,就可能会发生越界访问异常的错误。
所以我们也要保证,多个线程外部调用安全类时也能保持正确性。
对于上面的代码我们可以做如下改进:
public static Object getLast(Vector list){
synchronized(list){
int lastIndex==list.size()-1;
return list.get(