zoukankan      html  css  js  c++  java
  • Vector、HashTable线程不安全示例

    下面这样写法是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);
                }
          }
     }
  • 相关阅读:
    HDU 6333.Problem B. Harvest of Apples-组合数C(n,0)到C(n,m)求和-组合数学(逆元)+莫队 ((2018 Multi-University Training Contest 4 1002))
    HDU 6330.Problem L. Visual Cube-模拟到上天-输出立方体 (2018 Multi-University Training Contest 3 1012)
    HDU 6326.Problem H. Monster Hunter-贪心(优先队列)+流水线排序+路径压缩、节点合并(并查集) (2018 Multi-University Training Contest 3 1008)
    杭电1518 Square(构成正方形) 搜索
    POJ1659 Frogs' Neighborhood(青蛙的邻居) Havel-Hakimi定理
    杭电1133 排队买票 catalan
    hdu 5945 Fxx and game 单调队列优化dp
    Codeforces Round #278 (Div. 2) D. Strip 线段树优化dp
    hdu 4348 To the moon 主席树区间更新
    hdu 4417 Super Mario 树状数组||主席树
  • 原文地址:https://www.cnblogs.com/jing99/p/11306496.html
Copyright © 2011-2022 走看看