• 多线程下HashMap与Hashtable


    最近在多线程环境下操作HashMap,在程序中执行最多的是“查询”,但同时也要维护数据的“添加”和“删除”

    早在开发前就知道Hashtable是同步的,而HashMap是异步的。

    好吧在这里承认错误:限于没有犯过这个错误也没有见过实例场景,开发前未做好评估

    现在说说我的这次需求吧:

    1、要求新增一个功能页面,点击功能按钮弹出页面

    2、页面前后台校验器两个(在这里不做追述)

    3、提交修改后,提交按钮并disabled该按钮,页面特定区域显示动态Loading图标,并要求不影响主功能进程,若关闭弹出页面让其后台继续执行。但执行结果不再展示

    以上是本次需求的大体内容,下面详细说说需求点3使用HashMap出现的场景

    设计思路是这样的:

    1、建立一个静态私有的HashMap,并提供对外的get方法

    2、给对象设置一个flag状态:未得到执行结果置为false,得出执行结果置为true

    3、提交页面将页面对象传递到后台,将原可编辑区域全部disabled,以对象Id做HashMap的Key,判断HashMap中是否存在该Key,若存在则将正在执行的提示结果返回,若不存在则将该对象flag值置false添加到HashMap中并创建线程,主线程结束则启动页面定时器

    4、线程任务执行完成后将HashMap中对应的对象flag置为true

    5、通过页面定时器定时执行查询HashMap,若flag为true则将灰显去除,动态Loading图标隐藏,展示执行结果

    6、当我们提交页面后线程任务正在执行,页面仍然Loading状态时关闭页面(关闭页面前停止页面定时查询)

    7、再次打开该页面并重新提交,页面一直处于Loading状态(线程死锁)

    8、当时的规避措施:在每次启动线程前new 一个新对象而不使用当前对象

    今天偶然中看到一篇Hashtable与HashMap的实例文章,让我明白了当时HashMap中判断Key是否存在后才创建线程的想法并没有错误,只是线程中添加、删除需要使用Hashtable

    结论:看来在多线程的环境下,还得用Hashtable,虽说HashMap的性能 能提高一些,但是因为本身是不同步的,所以不能使用在多线程下。当然,如果只是在多线程下进行简单的“查询”,不对数据进行“添加”和“删除”,那用 HashMap是可以的,并且肯定能提高性能的。

    下面是我在网上搜索到的别人网友写的一些相关内容:

    1、如果线程要求安全,使用Vector,Hashtable

    2、如果不要求线程安全,应使用ArrayList,LinkedList,HashMap

    3、如果要求键值对,则使用HashMap、Hashtable

    4、如果数据很大,又要线程安全考虑Vector


    访问效率最高的是ArrayList,HashTable次之
    如果你会进行大量的插入/删除操作,而不是对容器中的元素进行简单的访问,那就该用LinkedList了

    在单线程下:vector和hashtable已经被ArrayList和hashMap代替,所以效率是最低的

  • 相关阅读:
    Windows7单机部署Hbase
    Geotools系列之Geotools DataStore
    Java中的SPI机制
    Hbase Java API调用实例
    调用Geotellis的API上传本地Tiff文件至Hbase/Hadoop
    Windows7单机部署Hadoop
    windows环境下配置GeoServer
    C/C++程序从编译到链接的过程
    中兴的一道笔试题
    腾讯笔试题----格雷码的实现
  • 原文地址:https://www.cnblogs.com/qq809306794/p/4050878.html
Copyright © 2020-2023  润新知