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