zoukankan      html  css  js  c++  java
  • java中vector与hashtable操作

    本人第一次发文,有意见请大家绕道!

        众所周知,java中vector与hashtable是线程安全的,主要是java对两者的操作都加上了synchronized,也就是上锁了。因此 在vector与hashtable的操作是不会出现问题。但是有一种情况:就是将一个hashtable copy到另一个hashtable时,假如使用putAll方法的花,会抛出一个 java.util.ConcurrentModificationException异常。先上代码:

    TestSync.java

     1 public class TestSync
    2 {
    3
    4 /**
    5 * main(这里用一句话描述这个方法的作用)
    6 * (这里描述这个方法适用条件 – 可选)
    7 * @param args
    8 * @return void
    9 * @exception
    10 * @since 1.0.0
    11 */
    12 public static void main(String[] args)
    13 {
    14 Map<Integer,User> list = new Hashtable<Integer, User>();
    15 List<User> vec = new Vector<User>();
    16 TestThread thread = new TestThread();
    17 thread.start();
    18 int i = 0;
    19 while(i<1000)
    20 {
    21 i++;
    22 System.out.println("iiiiiiiiii=------------" + i);
    23 list.clear();
    24 vec.clear();
    25
    26 //vector与hashtable是线程安全的 ,putAll方法中两个集合实现不一样
    27 vec.addAll(Constans.USERVEC);
    28 // synchronized (Constans.USERLIST)
    29 // {
    30 list.putAll(Constans.USERLIST);
    31 // }
    32 System.out.println("--------" + list.size());
    33 System.out.println("--------" + vec.size());
    34 }
    35 System.out.println("Over---------------------------------------------");
    36 }
    37
    38 }
    39
    40 class Constans
    41 {
    42 public static Map<Integer,User> USERLIST = new Hashtable<Integer, User>();
    43 public static List<User> USERVEC = new Vector<User>();
    44 }
    45
    46 class TestThread extends Thread
    47 {
    48 @Override
    49 public void run()
    50 {
    51 for(int i=0;i<100000;i++)
    52 {
    53 User user = new User();
    54 user.setId(i);
    55 user.setName("name" + i);
    56 if(!Constans.USERLIST.containsKey(i))
    57 {
    58 Constans.USERLIST.put(i,user);
    59 Constans.USERVEC.add(user);
    60 }
    61
    62 }
    63 System.out.println("线程结束------------");
    64 }
    65
    66 }

    当我们将

        //synchronized (Constans.USERLIST)  
    // {
    list.putAll(Constans.USERLIST);
    // }

    不使用同步时,就回抛出异常。是由于Constans.USERLIST不同步,而不是putAll方法不安全。

    而Vector与Hashtable不同的是Vector的addAll方法不使用同步也可以正常运行,那是由于Vector的addAll与Hashtable的putAll方法不同,Vector的addAll会将参数先copy一份,因此不会产生异常。

     User.java

    public class User
    {
    private int id;
    private String name;
    public int getId()
    {
    return id;
    }
    public void setId(int id)
    {
    this.id = id;
    }
    public String getName()
    {
    return name;
    }
    public void setName(String name)
    {
    this.name = name;
    }

    }

    写的不好,大家原谅。






  • 相关阅读:
    [CF997E] Good SubSegment
    CF916E
    BZOJ2006 超级钢琴
    BZOJ4571
    凸包总结
    树形DP入门
    bzoj4300 绝世好题(位运算+DP)
    bzoj4552 [Tjoi2016&Heoi2016]排序 (线段树+二分)
    SP1716 GSS3
    Noip2009 Hankson 的趣味题 (简单数学)
  • 原文地址:https://www.cnblogs.com/likanmama/p/2260243.html
Copyright © 2011-2022 走看看