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

TestSync.java

代码如下 复制代码
  public class TestSync
{
 
     /**  
      * main(这里用一句话描述这个方法的作用)  
      * (这里描述这个方法适用条件 – 可选)  
      * @param args   
      * @return void  
      * @exception   
      * @since www.111cn.net 1.0  
 */
     public static void main(String[] args)
     {
         Map<Integer,User> list  = new Hashtable<Integer, User>();
         List<User> vec = new Vector<User>();
         TestThread thread = new TestThread();
         thread.start();
         int i = 0;
        while(i<1000)
         {
             i++;
             System.out.println("iiiiiiiiii=------------" + i);
             list.clear();
             vec.clear();
            
             //vector与hashtable是线程安全的 ,putAll方法中两个集合实现不一样
             vec.addAll(Constans.USERVEC);
 //            synchronized (Constans.USERLIST)
 //            {
                 list.putAll(Constans.USERLIST);
 //            }
             System.out.println("--------" + list.size());
             System.out.println("--------" + vec.size());
         }
         System.out.println("Over---------------------------------------------");
     }
 
 }
 
 class Constans
 {
     public static Map<Integer,User> USERLIST  = new Hashtable<Integer, User>();
     public static List<User> USERVEC = new Vector<User>();
 }
 
 class TestThread extends Thread
 {
     @Override
     public void run()
     {
         for(int i=0;i<100000;i++)
         {
             User user = new User();
             user.setId(i);
             user.setName("name" + i);
            if(!Constans.USERLIST.containsKey(i))
             {
                 Constans.USERLIST.put(i,user);
                 Constans.USERVEC.add(user);
             }
            
         }
         System.out.println("线程结束------------");
     }
    
 }

当我们将

代码如下 复制代码
    //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;
    }
   
}

写的不好,大家原谅。

更多详细内容请查看:http://www.111cn.net/jsp/53/40794.htm

java中vector与hashtable操作详解的更多相关文章

  1. Java 中的异常和处理详解

    Java 中的异常和处理详解 原文出处: 代码钢琴家 简介 程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常.异常发生时,是任程序自生自灭,立刻退出终止,还是输出错误 ...

  2. Java中的多线程技术全面详解

    本文主要从整体上介绍Java中的多线程技术,对于一些重要的基础概念会进行相对详细的介绍,若有叙述不清晰或是不正确的地方,希望大家指出,谢谢大家:) 为什么使用多线程 并发与并行 我们知道,在单核机器上 ...

  3. Java中23种经典设计模式详解

    Java中23种设计模式目录1. 设计模式 31.1 创建型模式 41.1.1 工厂方法 41.1.2 抽象工厂 61.1.3 建造者模式 101.1.4 单态模式 131.1.5 原型模式 151. ...

  4. 关于Java中进程和线程的详解

    一.进程:是程序的一次动态执行,它对应着从代码加载,执行至执行完毕的一个完整的过程,是一个动态的实体,它有自己的生命 周期.它因创建而产生,因调度而运行,因等待资源或事件而被处于等待状态,因完成任务而 ...

  5. Java中的IO流系统详解(转载)

    摘要: Java 流在处理上分为字符流和字节流.字符流处理的单元为 2 个字节的 Unicode 字符,分别操作字符.字符数组或字符串,而字节流处理单元为 1 个字节,操作字节和字节数组. Java ...

  6. Java中的IO流系统详解

    Java 流在处理上分为字符流和字节流.字符流处理的单元为 2 个字节的 Unicode 字符,分别操作字符.字符数组或字符串,而字节流处理单元为 1 个字节,操作字节和字节数组. Java 内用 U ...

  7. java中内存结构及堆栈详解

    一. java内存结构 1. Heap(堆):实例分配的地方,通过-Xms与-Xmx来设置 2. MethodArea(方法区域):类的信息及静态变量. 对应是Permanet Generation, ...

  8. JAVA中IO和NIO的详解分析,内容来自网络和自己总结

    用一个例子来阐释: 一辆客车上有10个乘客,他们的目的地各不相同,当没有售票员的时候,司机就需要不断的询问每一站是否有乘客需要下车,需要则停下,不需要则继续开车,这种就是阻塞的方式. 当有售票员的时候 ...

  9. Java中的异常和处理详解

    简介 程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常.异常发生时,是任程序自生自灭,立刻退出终止,还是输出错误给用户?或者用C语言风格:用函数返回值作为执行状态?. ...

随机推荐

  1. 栈上连续定义的int变量,地址相差12个字节

    在VS2010,进行调试的时候,发现连续定义的int变量,地址相差12个字节.这是为什么? 按照我们的理解,int占用4个字节,应该相差4个字节.这是因为VS2010在Debug模式下,int变量占用 ...

  2. 创建C#串口通信程序详解

    在.NET平台下创建C#串口通信程序,.NET 2.0提供了串口通信的功能,其命名空间是System.IO.Ports.这个新的框架不但可以访问计算机上的串口,还可以和串口设备进行通信.我们将使用标准 ...

  3. 日志记录到txt文件

    using System;using System.Collections.Generic;using System.IO;using System.Linq;using System.Web;usi ...

  4. ibatis 分页的简单实现

    ibatis 物理分页的简单实现 cheungmine 2013-8-26 使用SSI (Struts2, Spring3, iBATIS2.3)框架开发Web服务的时候有一个需求就是对查询得到的结果 ...

  5. iOS开发——UI篇Swift篇&玩转UItableView(三)分组功能

    UItableView分组功能 class UITableViewControllerGroup: UIViewController, UITableViewDataSource, UITableVi ...

  6. Python中的注释(转)

    一.单行注释     单行注释以#开头,例如:     print 6 #输出6 二.多行注释     (Python的注释只有针对于单行的注释(用#),这是一种变通的方法)      多行注释用三引 ...

  7. 判断浏览器是否IE10

    项目中做打印预览时,在IE10中出现兼容性问题,需要针对IE10做特殊处理. 在网上搜了一下,有三种方法可以实现 一.特性检测:@cc_on <!--[if !IE]><!--> ...

  8. linux 内核参数VM调优 之 参数调节和场景分析

    1. pdflush刷新脏数据条件 (linux IO 内核参数调优 之 原理和参数介绍)上一章节讲述了IO内核调优介个重要参数参数. 总结可知cached中的脏数据满足如下几个条件中一个或者多个的时 ...

  9. listen和accept函数

    listen函数是用来设置监听连接的句柄和队列 当listen函数执行完成以后,服务端就已经可以接受客户端来的新连接了,新连接完成以后listen会把客户端的ip,port和连接句柄放在监听队列里面, ...

  10. NHibernate教程

    NHibernate教程 一.NHibernate简介 在今日的企业环境中,把面向对象的软件和关系数据库一起使用可能是相当麻烦.浪费时间的.NHibernate是一个面向.Net环境的对象/关系数据库 ...