首页 > 代码库 > 多线程下HashMap与Hashtable
多线程下HashMap与Hashtable
最近在多线程环境下操作HashMap,在程序中执行最多的是“查询”,但同时也要维护数据的“添加”和“删除”
早在开发前就知道Hashtable是同步的,而HashMap是异步的。
好吧在这里承认错误:限于没有犯过这个错误也没有见过实例场景,开发前未做好评估
现在说说我的这次需求吧:
1、要求新增一个功能页面,点击功能按钮弹出页面
2、页面前后台校验器两个(在这里不做追述)
3、提交修改后,提交按钮并disabled该按钮,页面特定区域显示动态Loading图标,并要求不影响主功能进程,若关闭弹出页面让其后台继续执行。但执行结果不再展示
以上是本次需求的大体内容,下面详细说说需求点3使用HashMap出现的场景
设计思路是这样的:
1、建立一个静态公有的HashMap
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代替,所以效率是最低的
多线程下HashMap与Hashtable