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

    }

    写的不好,大家原谅。






  • 相关阅读:
    通讯录封装实现
    简单通讯录的实现 main..h .m文件全部
    iOS 开发 OC编程 字典和集合 排序方法
    iOS 开发 OC编程 数组冒泡排序.图书管理
    iOS 开发 OC编程 属性和字符串练习
    iOS 开发 OC编程 属性和字符串
    iOS 开发 OC编程 便利构造器以及初始化方法
    iOS 开发 OC编程 方法的书写
    IOS 开发 OC编程 类和对象
    iOS 开发 c语言阶段考试题
  • 原文地址:https://www.cnblogs.com/likanmama/p/2260243.html
Copyright © 2011-2022 走看看