一、传统集合的缺陷
传统的集合,在并发访问的时候,是有问题的。如hashset、hashmap和arrayList,多个线程在对他们取数据、放数据的时候,是有问题的,因为他们是线程不安全的。由于没有控制并发,会导致数据的不一致,引起死循环。
为什么会引起死循环?拿HashMap来看,看一下HashMap的get函数的源代码:
public V get(Object key){
if(key == null){ return getForNullKey(); }
int hash = hash(key.hashCode());
for(Entry<k,v> e = table[indexFor(hash,table.length)];
e != null;
e = e.next()){
if(e.hash == hash && ((k = e.key) == key||key.equals(k)))
return e.value;
}
return null;
}</k,v>
get函数会根据key的hashCode来锁定多个对象,并且遍历这些对象来找到key所对应的对象。当多个线程不安全的修改HashMap数据结构的时候,有可能使得这个函数进入死循环。
再比如一个线程在遍历数据
1 2 3 |
|
其中hasnext
1 2 3 4 5 6 |
|
此时还有一个线程在取数