首页 > 代码库 > 多线程下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