package concurrent;
import java.util.Collections;
import java.util.Vector;
/*
* @author: wjf
* @version: 2016年3月27日 下午8:32:59
*/
public class TestCollection {
/*
* 容器主要有四大类,list ,set ,queue ,map
* 期中 lsit,set,queue 实现了collection 接口,map 本身是一个接口
* ArrayList LinkedList 实现了 list 接口,HashSet 实现了 set接口,Deque 继承了 queue接口,priorityQueue 实现了deque
* 另外 linkedList 也实现了queue 接口
*
*然而这些类都不是线程安全的
* 线程安全的类有两大类
* Vector,Stack,HashTable
* Collections中的静态工厂方法创建的类
* Vector 实现了 list 接口,和 arraylist 类似,但是方法 都用 synchronized 修饰了
* Stack 实际上继承了 Vector
* HashTable 和 HashMap 类似,但是也是 方法使用了 synchronized
*
* 注意一点:collections 和 collection 不同
* collection 是顶层接口,collections 是 一个工具类,提供了集合排序,查找,还有一些 静态的工厂方法
*
*/
public static void main(String[] args) throws InterruptedException {
// TODO Auto-generated method stub
Vector<Integer> vector=new Vector<Integer>();
while(true){
for(int i=0;i<10;i++){
vector.add(i);
}
Thread t1=new Thread(){
public void run(){
for(int i=0;i<vector.size();i++){
vector.remove(i);
}
}
};
Thread t2=new Thread(){
public void run(){
for(int i=0;i<vector.size();i++){
// System.out.println(vector.get(i));
vector.get(i);
}
}
};
t1.start();
t2.start();
t1.join();
t2.join();
}
}
}
上面的 代码 运行结果
分析 上面的 vector 只能保证 每个操作 是 同步的
但是 比如:
for(int i=0;i<vector.size();i++){ 这一行的到结果 是 9
vector.remove(i); 执行到了 这里把9 删除了 ,然而下面线程2就会 误操作
}
for(int i=0;i<vector.size();i++){ // 这一行的到结果 是 9
vector.get(i);
}
结果办法 很简单
Thread t1=new Thread(){
public void run(){
synchronized(TestCollection.class){
for(int i=0;i<vector.size();i++){
vector.remove(i);
}
}
}
};
Thread t2=new Thread(){
public void run(){
synchronized(TestCollection.class){
for(int i=0;i<vector.size();i++){
// System.out.println(vector.get(i));
vector.get(i);
}
}
}
};