最近在多线程环境下操做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代替,因此效率是最低的