您的位置:首页 > 编程语言 > Java开发

Java 并发容器

2016-03-27 21:01 453 查看
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);
}
}
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: