多线程下HashMap与Hashtable

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

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

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

如今说说个人此次需求吧:性能

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

二、页面先后台校验器两个(在这里不作追述)线程

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

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

设计思路是这样的:进程

一、创建一个静态私有的HashMap,并提供对外的get方法开发

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

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

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

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

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

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

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

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

结论:看来在多线程的环境下,还得用Hashtable,虽然说HashMap的性能 能提升一些,可是由于自己是不一样步的,因此不能使用在多线程下。固然,若是只是在多线程下进行简单的“查询”,不对数据进行“添加”和“删除”,那用 HashMap是能够的,而且确定能提升性能的。

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

一、若是线程要求安全,使用Vector,Hashtable

二、若是不要求线程安全,应使用ArrayList,LinkedList,HashMap

三、若是要求键值对,则使用HashMap、Hashtable

四、若是数据很大,又要线程安全考虑Vector


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

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

相关文章
相关标签/搜索