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); } } } };
相关文章推荐
- 20145221 《Java程序设计》第四周学习总结
- JVM——JVM性能调优
- Java学习路线
- SpringMVC总结一次完整的请求
- Spring 容器IOC的初始化过程
- Java笔记---初试云服务器
- java内存分配与参数配置
- 学习javaEE每一天2016.3.27
- JAVA常用集合框架用法详解基础篇三之Colletion子接口Set
- 20145329《Java程序设计》第四周学习总结
- (keymap设置及eclipse常用快捷键总结)
- 反射机制_介绍_Class对象获取_动态操作_构造器_方法_属性JAVA211-212
- SpringMVC学习系列(3) 之 URL请求到Action的映射规则
- java 语法
- 【spring基础】AOP概念与动态代理详解
- 20145315 《Java程序设计》第四周学习总结
- Java学习进程day_01
- [leetcode-338]Counting Bits(java)
- Thread详解4:线程的优先级
- java基础-003