java-同步集合Concurrent Collections应用

一、传统集合的缺陷

传统的集合,在并发访问的时候,是有问题的。如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

while(hasnext()){

   next(){cursor++;}

}

其中hasnext

 

1

2

3

4

5

6

hasnext(){

  if(cursor == count){

    return false;

  }

  return true;

}


此时还有一个线程在取数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值