HashMap和HashTable到底该如何选择?

土圭垚 2012-08-03 10:26:20
hashtable跟hashmap的区别:
hashtable是线程安全的,即hashtable的方法都提供了同步机制!(这一点是不是很影响性能?)
hashmap不是线程安全的,即不提供同步机制。(在多线程访问是不是会有问题?)
hashtable不允许插入空值,hashmap允许!

现在项目中的问题是,根据当前的订单号调用银行的转账接口,由于性能问题我不能将方法synchronized,因为接口本身速度就不快,为了防止重复提交,我在转账接口中设置了一个全局的集合,用的是HashMap,就是当某一个订单号进入这个方法时,先判断订单号是否在Map集合中,不在我将订单号保存在Map集合中,然后调用转账接口,当这比交易走完了,将订单号从集合中移除。如果订单号在Map集合中将直接返回。以前一直没出现过问题,但是昨天,客户出现了重复交易。是不是我用的hashMap不是线程安全的所导致的,如果我换成了hashTable是不是能解决这个问题?

还有就是hashMap和hashTable在性能上是不是有很大的差别?

还有没有别的解决办法?或者我这方法根本不可取?请各位指点一下。。。谢谢。。。。
...全文
179 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
土圭垚 2012-08-07
  • 打赏
  • 举报
回复
交易量在月底的时候挺大的,是在不行就用HashTable吧,想在这里问下有没有别的解决思路。或者是给位遇到这样的问题是怎么解决的?
[Quote=引用 5 楼 的回复:]

看你交易的量,如果不大,完全可以
public static final Object key = new Object()

然后在你的hashMap代码部分
synchronized(key){
hashMap.put(...)
}

类似的方法,
当然,交易量不大,用HashTable也行,性能差距没想象的大(换句话说,整个交易的性能瓶颈,不是HashTable造成……
[/Quote]
  • 打赏
  • 举报
回复
如果我没记错的话,不是 HashTable,而是 Hashtable 吧?
龙四 2012-08-03
  • 打赏
  • 举报
回复
http://gee.cs.oswego.edu/dl/concurrency-interest/index.html

到并发大神的页面去下载吧


[Quote=引用 3 楼 的回复:]

引用 2 楼 的回复:

"当某一个订单号进入这个方法时,先判断订单号是否在Map集合中,不在我将订单号保存在Map集合中"
如果没有同步,这里存在竞态条件问题
有可能两个线程同时判断Map中有没有,此时都返回没有,那么就会都去操作一遍

很幸运,ConcurrentHashMap#putIfAbsent(K key, V value) 方法有你要的功能

如果该方法的返回值是……
[/Quote]
土圭垚 2012-08-03
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

"当某一个订单号进入这个方法时,先判断订单号是否在Map集合中,不在我将订单号保存在Map集合中"
如果没有同步,这里存在竞态条件问题
有可能两个线程同时判断Map中有没有,此时都返回没有,那么就会都去操作一遍

很幸运,ConcurrentHashMap#putIfAbsent(K key, V value) 方法有你要的功能

如果该方法的返回值是非null,表示已经有线程put……
[/Quote]
ConcurrentHashMap是1.5才有的,项目目前用到的是1.4的jdk。。。。。。这个很蛋疼。。。。
龙四 2012-08-03
  • 打赏
  • 举报
回复
"当某一个订单号进入这个方法时,先判断订单号是否在Map集合中,不在我将订单号保存在Map集合中"
如果没有同步,这里存在竞态条件问题
有可能两个线程同时判断Map中有没有,此时都返回没有,那么就会都去操作一遍

很幸运,ConcurrentHashMap#putIfAbsent(K key, V value) 方法有你要的功能

如果该方法的返回值是非null,表示已经有线程put过了,这个线程就无需再操作了
龙四 2012-08-03
  • 打赏
  • 举报
回复
ConcurrentHashMap
老紫竹 2012-08-03
  • 打赏
  • 举报
回复
看你交易的量,如果不大,完全可以
public static final Object key = new Object()

然后在你的hashMap代码部分
synchronized(key){
hashMap.put(...)
}

类似的方法,
当然,交易量不大,用HashTable也行,性能差距没想象的大(换句话说,整个交易的性能瓶颈,不是HashTable造成的)

50,523

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧