标签:
同步安全的集合,在多线程下用到这个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