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

}

写的不好,大家原谅。






原文地址:https://www.cnblogs.com/likanmama/p/2260243.html