黑马程序员技术交流社区

标题: 用多线程操作同一个map集合,要注意的安全问题 [打印本页]

作者: 一小丢丢    时间: 2016-10-20 23:16
标题: 用多线程操作同一个map集合,要注意的安全问题
map集合的特点:
       底层存储结构是哈希表
       map集合是双列的,值是成对出现的key--value,键唯一,值不唯一.
       效率高,线程不安全
问题是线程为什么会不安全?
例如:用两条线程同时往一个map集合中添加元素,键是可能重复的.
为什么会重复?
因为,在map的底层源代码中是通过重写hashcode和equals方法来保证键值的唯一性的即
if (e.hash == hash && ((k = e.key) == key || key.equals(k)))   来 验证键是否唯一. 如果通过了验证,还没有保存的时候,就被其他线程抢走了. 键 就可能重复了.
解决办法是在线程中重写run方法时要加同步代码块,保证在一个线程给map集合添加元素时,验证与保存的过程时一气呵成.
所以,在用多线程操作同一个map集合时,要注意安全问题.

作者: yu244934256    时间: 2016-10-21 00:29
不错哦,不过有个更厉害的方法,就是 Collections.synchronizedMap(map);
作者: 一小丢丢    时间: 2016-10-21 00:34
yu244934256 发表于 2016-10-21 00:29
不错哦,不过有个更厉害的方法,就是 Collections.synchronizedMap(map);

是吗,这个我还不知道,我去查查
作者: 读书可以当饭吃    时间: 2016-10-21 01:09
二楼正解,集合工具类有方法把不安全的集合变成安全的




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2