ConcurrentHashMap 和CopyOnWriteArrayList线程安全

数据储存一般用数组或容器集合,下标第一位都是0,集合主要有List,Set,Map  10 010 10 0x10

List特点:元素有顺序,有重复(Collection子接口)

Set特点:元素无顺序,无重复(Collection子接口)

Map特点:元素按键值对存储,无放入顺序,一个Map中不能有相同的key,每个key映射一个 value

Map map = new HashMap();
  Iterator iter = map.entrySet().iterator();//Map遍历
  while (iter.hasNext()) {
  Map.Entry entry = (Map.Entry) iter.next();
  Object key = entry.getKey();
  Object val = entry.getValue();
  }

经常看到介绍 ArrayList 和HashMap是异步,Vector和HashTable是同步,这里同步是线程安全的,异步不是线程安全的。

比如A  B两个线程 同时操作modelHashMap
1.B线程执行存放数据
modelHashMap.put("1","2");
2.A线程执行get获取数据
modelHashMap.get("1")
它的值本来应该是2,但是如果A线程在刚到达获取的动作还没执行的时候,
线程执行的机会又跳到线程B,此时线程B又对modelHashMap赋值 如:modelHashMap.put("1","3");
然后线程虚拟机又执行线程A,A取到的值为3,这样map中第一个存放的值 就会丢失。。。。。

之前来说,如果要保证多个线程同时访问安全性,一般使用同步集合包装器 synchronizedMap 和 synchronizedList,

而现在JDK又新增了ConcurrentHashMap 和CopyOnWriteArrayList

有条件的线程安全性

    Map m = Collections.synchronizedMap(new HashMap());
    List l= Collections.synchronizedList(new ArrayList());
    
    synchronized (l) {
    Iterator i = l.iterator(); // Must be in synchronized block
    while (i.hasNext())     
    System.out.println(i.next());
    }

可伸缩性

可伸缩性指的是一个应用程序在工作负载和可用处理资源增加时其吞吐量的表现情况。一个可伸缩的程序能够通过使用更多的处理器、内存或者I/O带宽来相应地处理更大的工作负载。锁住某个共享的资源以获得独占式的访问这种做法会形成可伸缩性瓶颈――它使其他线程不能访问那个资源,即使有空闲的处理器可以调用那些线程也无济于事。为了取得可伸缩性,我们必须消除或者减少我们对独占式资源锁的依赖。它提供了好得多的并发性。多个读操作几乎总可以并发地执行,同时进行的读和写操作通常也能并发地执行,很大地提高效率。
ConcurrentHashMap<Integer, Integer> map = new ConcurrentHashMap<Integer, Integer>();//并发性高
List<String> list =new CopyOnWriteArrayList<String>();//适合使用在读操作远远大于写操作的场景里,比如缓存。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值