Java Vector线程安全?
来源:互联网 发布:nba2017新秀目前数据 编辑:程序博客网 时间:2024/05/13 06:06
参考资料:
1. 深入理解Java虚拟机 第二版
2. http://bbs.csdn.net/topics/320059353
先看段代码:
private static Vector<Integer> vector=new Vector(); public static void main(String[] args) { while(true){ for(int i=0;i<10;i++){ vector.add(i); //往vector中添加元素 } Thread removeThread=new Thread(new Runnable() { @Override public void run() { //获取vector的大小 for(int i=0;i<vector.size();i++){ //当前线程让出CPU,使例子中的错误更快出现 Thread.yield(); //移除第i个数据 vector.remove(i); } } }); Thread printThread=new Thread(new Runnable() { @Override public void run() { //获取vector的大小 for(int i=0;i<vector.size();i++){ //当前线程让出CPU,使例子中的错误更快出现 Thread.yield(); //获取第i个数据并打印 System.out.println(vector.get(i)); } } }); removeThread.start(); printThread.start(); //避免同时产生过多线程 while(Thread.activeCount()>20); } }
运行之后,会有如下异常:
4661835Exception in thread "Thread-285" java.lang.ArrayIndexOutOfBoundsException: Array index out of range: 11 at java.util.Vector.get(Unknown Source) at VectorTest$2.run(VectorTest.java:31) at java.lang.Thread.run(Unknown Source)7906
这表明上述代码在使用Vector的时候线程并不是安全的,使用get访问Vector时出现了越界。这是为什么呢?
Vector类中对get以及remove,size方法都加了synchronized关键字来保证同步,也就说当一个线程调用了这些方法时,其他线程不能再同时调用这些方法。换言之,不能出现两个及两个以上的线程在同时调用这些同步方法。
那么为什么例子中会出现问题呢?这是因为 例子中有些线程连续调用了两个或两个以上的同步方法。
例子中 removeThread线程先调用了vector.size()方法获得vector的大小,接着调用vector.remove(i)移除第i个元素;而printThread线程也先调用vector.size()方法获得vector的大小,接着调用vector.get()获得第i个元素。
假设此时vector大小为5,此时printThread线程执行到 i=4 ,进入for循环但在 System.out.println(vector.get(i));之前
printThread线程的CPU时间片已到,线程printThread转入就绪状态;
此时removeThread线程获得CPU开始执行,把vector的5个元素全删除了,这是removeThreadCPU时间片已到;
接着printThread获得CPU进行执行,由于之前printThread中的i==4,于是调用vector.get(4)获取元素,此时由于vector中的元素已被removeThread线程全部删除,因此报错。
总的来说,vector保证了其同步方法不能被两个及两个以上线程同时访问,但是我们自己的操作会使得即使使用了Vector线程也不安全,如果不大清楚,最好自己加上 synchronized进行同步吧。
- Java Vector线程安全?
- java ArrayList vector 线程安全
- 线程安全-关于vector
- Vector实现线程安全
- Vector线程安全
- Java中线程安全与线程非安全ArrayList,Vector 和 HashMap,Hashtable 和StringBuffer,StringBuilder
- Vector 是线程安全的?
- Vector 是线程安全的?
- Vector 线程安全与不安全
- 谈谈Vector的线程安全
- Vector 是线程安全的?
- Vector是线程安全的
- ArrayList非线程安全、Vector线程安全原理
- ArrayList和Vector线程安全理解
- ArrayList和Vector线程安全理解
- ArrayList和Vector线程安全理解
- Vector 是线程安全的?(转载)
- vector的详细用法---线程安全
- ListView使用CheckBox选择行后获取数据
- JavaScript 中三种常见的提示框(alert、confirm、prompt)
- androin各类动画效果实现
- List--C++模板类
- android Handler的基本使用方法和介绍(二)
- Java Vector线程安全?
- Android:SharedPreferences
- SSH搭建
- Intent自定义隐式意图激活Activity
- 全新雅思模拟考试开启全国高校预热活动
- Plone 5 首页错误BUG
- 我的世界汉化
- Leetcode: Coin Change
- android-sharing files with NFC