A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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

3 个回复

倒序浏览
不错哦,不过有个更厉害的方法,就是 Collections.synchronizedMap(map);
回复 使用道具 举报
yu244934256 发表于 2016-10-21 00:29
不错哦,不过有个更厉害的方法,就是 Collections.synchronizedMap(map);

是吗,这个我还不知道,我去查查
回复 使用道具 举报
二楼正解,集合工具类有方法把不安全的集合变成安全的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马