码迷,mamicode.com
首页 > 其他好文 > 详细

ConcurrentHashMap 同步安全 的真正含义(stringbuff 是同步安全的,stringbutter 不安全)

时间:2015-04-07 23:00:36      阅读:158      评论:0      收藏:0      [点我收藏+]

标签:

同步安全的集合,在多线程下用到这个map是安全的,但这个安全指的是什么?不是说现在2个线程用到这个map,结果这个map我就不用加synchronize同步锁了,不是这样子的,多线程下还是要加这个同步锁,因为map自身的线程安全不是指这一方面的安全,当map中的value是一个vo对象时,而且这个对象在多线程下有改动,还是需要synchronize 锁住的,而map自身的线程安全不安全是指  在map遍历时能否进行元素的删除,修改可以,但删除有的map可以有的则不行,不行的map删除必报错:java.util.ConcurrentModificationException ,这是因为 hashMap、list 等 集合是不安全 集合,遍历时是不能删除的,而 ConcurrentHashMap 是多线程安全的map集合,遍历时就可以删除。至于为啥不能删除是因为hashmap、list等遍历时是通过itator 遍历的,而其遍历时是元素是不可逆的,而且枷锁的,当正遍历时如有其中一个删除,等同步外部的list 或者 hashmap 时 由于找不到 list或者hashmap中的对应元素就会报错。 那不安全的集合啥时候用呢,一个是单线程下可以用,但仍不可以遍历时删除,还一个就是 比如基础模板封装的集合,这个集合只会 get不会删除,这种情况可以选择非同步安全的集合。所以不管单线程还是多线程,几乎最好都用线程安全的集合(集合只用来get 不会删除的除外可以用非安全的集合,如游戏基础数据存放的集合)。

ConcurrentHashMap 同步安全 的真正含义(stringbuff 是同步安全的,stringbutter 不安全)

标签:

原文地址:http://www.cnblogs.com/wzhanke/p/4399605.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!