Vector 线程安全与不安全
来源:互联网 发布:淘宝主图视频内存大小 编辑:程序博客网 时间:2024/05/18 12:29
下面这样写法是线程不安全的写法
import java.util.Vector;public class Test { private static Vector<Integer> vector = new Vector<Integer>(); public static void main(String[] args) { while (true) { for (int i = 0; i < 10; i++) { System.out.println("添加"); vector.add(i); } Thread removeThread = new Thread(new Runnable() { @Override public void run() { for (int i = 0; i < vector.size(); i++) { System.out.println("removeThread删除"); vector.remove(i); } } }); Thread printThread = new Thread(new Runnable() { @Override public void run() { for (int i = 0; i < vector.size(); i++) { System.out.println("printThread获取"); System.out.println((vector.get(i))); } } }); removeThread.start(); printThread.start(); //不要同时产生过多的线程,否则会导致操作系统假死 while (Thread.activeCount() > 20); } }}
尽管Vector get()、remove()、get() 方法是I同步的 但运行上面程序会出现以下错误
java.lang.ArrayIndexOutOfBoundsException: Array index out of range: 0at java.util.Vector.get(Vector.java:744)at Test$2.run(Test.java:29)at java.lang.Thread.run(Thread.java:722)Exception in thread "Thread-14857" java.lang.ArrayIndexOutOfBoundsException: Array index out of range: 0at java.util.Vector.get(Vector.java:744)at Test$2.run(Test.java:29)at java.lang.Thread.run(Thread.java:722)
import java.util.Hashtable;import java.util.Map;public class HashmapTest { private static Map<Integer,Integer> hashtable= new Hashtable<Integer,Integer>(); public static void main(String[] args) { while(true){ for (int i = 0; i < 10; i++) { System.out.println("添加"); hashtable.put(i, i); } Thread removeThread = new Thread(new Runnable() {@Overridepublic void run() { Iterator it = hashtable.entrySet().iterator(); while (it.hasNext()) { Map.Entry<integer integer=""> entry=(Entry<integer integer="">) it.next(); System.out.println("delete this: "+entry.getKey()+"==="+entry.getValue()); it.remove(); } } Thread getThread = new Thread(new Runnable() {@Overridepublic void run() { for (int i = 0; i < hashtable.size(); i++) { System.out.println("getThread获取"); System.out.println((hashtable.get(i))); }}}); removeThread.start(); getThread.start(); while (Thread.activeCount() > 20); } }}</integer></integer>
getThread获取
null
getThread获取
null
在多线程环境中,如果不在方法调用端做额外的同步措施,使用这段仍是线程不安全的,因为如果一个线程恰好再错误的时间删除了一个元素, 导致i不在可用的话,get方法会抛出一个ArrayIndexOutOfBoundsException
import java.util.Vector;public class Test { private static Vector<Integer> vector = new Vector<Integer>(); public static void main(String[] args) { while (true) { for (int i = 0; i < 10; i++) { System.out.println("添加"); vector.add(i); } Thread removeThread = new Thread(new Runnable() { @Override public void run() { synchronized (vector) { for (int i = 0; i < vector.size(); i++) { System.out.println("removeThread删除"); vector.remove(i); }} } }); Thread printThread = new Thread(new Runnable() { @Override public void run() { synchronized (vector) { for (int i = 0; i < vector.size(); i++) { System.out.println("printThread获取"); System.out.println((vector.get(i))); } } } }); removeThread.start(); printThread.start(); //不要同时产生过多的线程,否则会导致操作系统假死 while (Thread.activeCount() > 20); } } }
0 0
- Vector 线程安全与不安全
- 线程安全与不安全
- 线程安全与不安全
- 线程安全与不安全
- 线程安全与不安全
- 线程安全与不安全
- 线程安全与不安全
- 线程安全与线程不安全
- 线程安全与线程不安全
- 线程安全与线程不安全
- 线程安全与线程不安全
- 线程安全与线程不安全
- Java线程安全与不安全
- 线程安全与线程不安全的区别
- Java线程(一):线程安全与不安全
- Java线程(一):线程安全与不安全
- Java线程(一):线程安全与不安全
- Java线程(一):线程安全与不安全
- Android开发中adb启动失败adb连接异常的解决办法
- Spring JDBCの紹介
- 牛腩新闻发布系统——静态方法使用问题(Static)
- 338. Counting Bits
- Process, program, thread 的区别
- Vector 线程安全与不安全
- poj-3050-Hopscotch
- 【办公采购系统】系统中遇到的问题汇总(一)——模板页使用
- oj数据结构题谜之输出格式
- 华为老总推荐的文章
- googletest mock设置 编译器选项 vs下
- 搜索算法11之1016
- Shiro入门
- 如何在未知链表中找到一个中间节点