论坛首页 Java企业应用论坛

HashMap的非线程安全例子

浏览 2722 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-05-06   最后修改:2010-05-07

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),而当读操作完成时,依然读到的是老的数据,这个就是不能读到最新修改的数据。

 

论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics