本系列为本人在研读相关技术书籍后所总结之精华,希望能对大家有所帮助,有兴趣的可以加我好友,大家共同学习进步!
同步容器类
同步容器类包括Vector和Hashtable。这些类实现线程安全的方式是:将它们封装起来,并对每个公有的方法都进行同步,使得每次只有一个线程能访问容器的状态。(线程封闭)
同步容器类的问题
同步容器类都是线程安全的,但在某些情况下可能需要额外的客户端加锁来保护复合操作。容器上常见的复合操作:迭代
//P67 Vectorz中定义的两个方法
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);
}
比如当小县城A在包含10个元素的Vector上调用getLast,同时线程B在同一个Vector上调用deleteLast时,就可能出现异常。
解决方式:客户端加锁(同步代码块)
public static Object getLast(Vector list) {
synchronized (list) {
int lastIndex = list.size() - 1;
return list.get(lastIndex);
}
}
public static void deleteLast(Vector list) {
synchronized (list) {
int lastIndex = list.size() - 1;
list.remove(lastIndex);
}
}
同理,在迭代过程中也可能出现异常
for(int i=0;i<vector.size();i++){
doSomething(vector.get(i));
}
//带客户端加锁的迭代
synchronized (vector){