下面这样写法是Vector线程不安全的写法:

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: 0
at 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: 0
at java.util.Vector.get(Vector.java:744)
at Test$2.run(Test.java:29)

HashTable线程不安全写法:

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() {
@Override
public 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() {
@Override
public 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);
}
}
}

  会出现很多null值,但不错,因为没有那个key ,但不会报错

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);
}
}
}

最新文章

  1. SQLite 函数大全
  2. Java调优经验谈
  3. 数据库的Instance/Crash Recovery
  4. 解决JSP页面图片缓存问题
  5. javascript下用ActiveXObject控件替换word书签,将内容导出到word后打印第1/2页
  6. RemoteViews的理解和使用
  7. Immediate Decodability(字典树)
  8. C语言基础09
  9. angular.js的ui-router总结
  10. 分享一道JS前端闭包面试题
  11. Java中类的创建及类与对象的关系
  12. [leecode]---11.container with most water
  13. 【转】ArcGIS10的附件功能
  14. Matlab:五点差分方法求解椭圆方程非导数边值问题
  15. SDN期末作业验收
  16. mysql索引知识点汇总
  17. java中代理,静态代理,动态代理以及spring aop代理方式,实现原理统一汇总
  18. Maven– HelloWorld实例
  19. django使用bootstrap快速美化 admin后台
  20. php时间轴函数,很不错,记下了

热门文章

  1. kafka简单学习----遇到的问题
  2. delphi DBTreeview与数据库连接的数据存取
  3. 查看进程的命令ps
  4. [转]新浪云存储SCS Node.js使用指南
  5. Spring Security(20)——整合Cas
  6. OpenGL(5)——变换
  7. 重置fedora root密码
  8. VS.vs15
  9. OpenCV.问题&amp;解决
  10. WebSocket的简单概念