HashMap的非线程安全例子

HashMap在多线程访问时存在线程安全问题,举例如下,此例是用HashMap来记录Meeting的状态:

 

线程一在12:12:10put一个meetingKey, meetingStatus(123859963,InProgress)

线程二在12:12:11put一个meetingKey,(123859963,Close)

 

如果没有锁,则线程1和线程二能够同时put,如果线程二在线程一put过程中,先将HashMap(123859963,Close),注意此时,线程一继续运行,线程一会把线程二已经设置好的meeting 状态由close又改成了InProgress,这样meeting状态就不对了。

 

如果加上锁,则没有问题,因为线程一先拿到锁,直到put执行完以后,线程二才能拿到锁,执行Close操作。因此不存在线程安全问题。而保证HashMap线程安全

 

而ConcurrentHashMap不存在这个问题,它使用了锁分离技术,对于不同的Hash值,可以并发的写,对于相同的Hash值,映射在同一个segment上,所有落在这个segment上的数据,是由有读写锁进行控制的。

 

然而ConcurrentHashMap也不能保证强一致性,所谓的强一致性指的是,读者总是能够读到写者最新修改后的数据,而最终一致性指的是读者在某个最终状态能够读到写者写进去的数据,举例如下:

 

ConcurrentHashMap读和写没有使用读写锁进行互斥,当thread1读(123859963,InProgress),Thread2 put了新的数据(123859963,Close),而当读操作完成时,依然读到的是老的数据,这个就是不能读到最新修改的数据。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值