Java 并发容器

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);
                    }
                }
            }
        };
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值