• 并发类容器


    JDK5.0以后提供了多种并发类容器来替代同步类容器从而改善性能。同步类容器的状态都是串行化的。他们虽然实现了线程安全,但严重降低了并发性,在多线程环境时,严重降低了应用程序的吞吐量。并发类容器是专门针对并发设计的,使用ConcurrentHashMap来代替给予散列的传统的hashTable,而在ConcurrentHashMap中,添加了一些常见复合操作的支持,以及使用了CopyOnWriteArrayList代替vector,并发的CopyOnWriteArraySet,以及并发的Queue,ConcurrentLinkedQueue和LinkedBlockingQueue,前者是高性能的队列,后者是以阻塞形式的队列,具体实现Queue还有很多,例如ArrayBlockingQueue、PriorityBlockingQueue、SynchronizedQueue等。

    ConcurrentMap

    ConcurrentMap接口下有两个重要的实现:

      ConcurrentHashMap

      ConcurrentSkipListMap(支持并发排序功能,弥补ConcurrentHashMap)

    ConcurrentHashMap内部使用段(segment)来表示这些不同的部分,每个段其实就是一个小的HashTable,他们有自己的锁。只要多个修改操作发生在不同的段上,他们就可以并发的进行。把一个整体分成了16个段(segment),也就是最高支持16个线程的并发修改操作。这也是在多线程场景时减小锁的粒度从而降低锁竞争的一种方案。并且代码中大多共享变量使用volatile关键字声明,目的是第一时间获取修改的内容,性能非常好。

     1 package com.java.day02_concurrentMap;
     2 
     3 import java.util.Map;
     4 import java.util.Map.Entry;
     5 import java.util.concurrent.ConcurrentHashMap;
     6 
     7 public class UseConcurrentMap {
     8     public static void main(String[] args) {
     9         ConcurrentHashMap<String,String>map  = new ConcurrentHashMap<String,String>();
    10         map.put("k1", "v1");
    11         map.put("k2", "v2");
    12         map.put("k3", "v3");
    13         //如果k3不存在,则将这个值放入里面,如果k3存在,则不放入
    14         map.putIfAbsent("k3", "vvvv");
    15         
    16         for(Entry<String, String> me : map.entrySet()){
    17             System.out.println("key:"+me.getKey()+"   value:"+me.getValue());
    18         }
    19         
    20         
    21     }
    22 }

    运行结果:

    1 key:k3   value:v3
    2 key:k2   value:v2
    3 key:k1   value:v1

    Copy-On-Write容器:在读多写少的场景下应用

    Copy-On-Write简称cow,是一种用于程序设计中的优化策略。

    JDK里的COW容器有两种:CopyOnWriteArrayList和CoprOnWriteArraySet,COW容器非常有用,可以在非常多的并发场景中使用到。

    什么是CopyOnWrite容器?

    CopyOnWrite容器即写时复制的容器。通俗的理解是当我们往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进行copy,复制出一个新的容器,然后新的容器里添加元素,添加完元素后,再将原容器的引用指向新的容器。这样做的好处是我们可以对CopyOnWrite容器进行并发的读,而不需要加锁,因为当前容器不会添加任何元素。所以CopyOnWrite也是一种读写分离的思想,读和写不同的容器。

    1 CopyOnWriteArrayList<String> cwal = new CopyOnWriteArrayList<String>();
    2 CopyOnWriteArraySet<String> cwas = new CopyOnWriteArraySet<String>();

    举例:remove()方法底层,是加锁,ReentranLock类的锁(重入锁)

  • 相关阅读:
    Leetcode 1489找到最小生成树李关键边和伪关键边
    Leetcode 113 路径总和 II
    hdu 1223 还是畅通工程
    hdu 1087 Super Jumping! Jumping! Jumping!
    hdu 1008 Elevator
    hdu 1037 Keep on Truckin'
    湖工oj 1241 畅通工程
    湖工oj 1162 大武汉局域网
    hdu 2057 A + B Again
    poj 2236 Wireless Network
  • 原文地址:https://www.cnblogs.com/syousetu/p/6730497.html
Copyright © 2020-2023  润新知