zoukankan      html  css  js  c++  java
  • concurrent (一)concurrent

    参考文档:

    跳跃表原理分析:https://blog.csdn.net/a1259109679/article/details/46442895

    一、阻塞队列

    ArrayBlockingQueue

    一个由数组结构组成的有界阻塞队列
    可选公平策略(默认不保证公平)(可重入锁实现),必须指定大小,一把锁

    LinkedBlockingQueue

    一个由链表结构组成的,双向的,有界阻塞队列
    默认大小: Integer.MAX_VALUE,两把锁,头元素一把,尾元素一把

    PriorityBlockingQueue

    一个支持优先级排序的无界阻塞队列
    默认情况下元素采取自然顺序排列,也可以通过比较器comparator来指定元素的排序规则。元素按照升序排列。

    DelayQueue

    一个使用优先级队列实现的无界阻塞队列
    DelayQueue是一个支持延时获取元素的无界阻塞队列。队列使用PriorityQueue来实现。队列中的元素必须实现Delayed接口,在创建元素时可以指  定多久才能从队列中获取当前元素。只有在延迟期满时才能从队列中提取元素。

    SynchronousQueue

    一个不存储元素的阻塞队列
    SynchronousQueue是一个不存储元素的阻塞队列。每一个put操作必须等待一个take操作,否则不能继续添加元素。SynchronousQueue可以看成 是一个传球手,负责把生产者线程处理的数据直接传递给消费者线程。队列本身并不存储任何元素,非常适合于传递性场景,比如在一个线程中使用的数据,传递给另外一个线程使用,SynchronousQueue的吞吐量高于LinkedBlockingQueue 和 ArrayBlockingQueue。

    LinkedTransferQueue

    一个由链表结构组成的无界阻塞队列

    二、非阻塞队列

    concurrentlinkedqueue
    基于链表,无大小限制,基于cas的非阻塞队列。不允许null元素

    三、CopyOnWrite容器(读写分离)

    其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内容Copy出去形成一个新的内容然后再改,这是一种延时懒惰策略.写时加锁,读时不加锁。如果读时有其他线程同时在写,则读到的是旧数据,只保证最终数据一致性,不保证实时数据一致性
    CopyOnWriteArrayList
    CopyOnWriteArraySet
    应用场景:读多写少的并发场景
    缺点:  1)内存占用大
                2)数据一致性问题。
    注意:
          1)减少扩容开销。根据实际需要,初始化CopyOnWriteMap的大小,避免写时CopyOnWriteMap扩容的开销。
          2) 使用批量添加。因为每次添加,容器每次都会进行复制,所以减少添加次数,可以减少容器的复制次数。如使用上面代码里的addBlackList方法。

    四、map

    concurrenthashmap

    参考文档:http://www.infoq.com/cn/articles/ConcurrentHashMap/
    分段锁,segment, hashentry[]
    get()不加锁:volatile替换锁 segment的对象talbe 是volatile类型,java内存模型的happen before:写操作优先于读操作
    segment再哈希
    1 ) 将key 哈希得到值h1
    2)对h1的高位进行再哈希得到值h2,通过h2找到对应的segment.(为了均匀的分配到segment上)
    3)将h2再哈希 得到值h3,通过h3找到entry
    put()加锁:插入元素前判断是否扩容,针对当前segment进行扩容
    size(): 两种策略
           1)先不加锁,两次累加segment size,如果未发生改变 则结束:modCount变量,在put , remove和clean方法里操作元素前都会将变                                       量modCount进行加1, 那么在统计size前后比较modCount是否发生变化
           2)方法1 失败后,加锁累加sementsize
    初始化参数:initialCapacity容量(default16),loadFactor加载因子(default0.75),concurrencyLevel(default16
    )并发级别  组合可选
    segment 与concurrencyLevel的关系:http://blog.csdn.net/hitxueliang/article/details/24734861

    ConcurrentSkipListMap

    基于跳跃表(一种可以代替平衡树的数据结构)
    key有序,支持高并发,且并发越高的情况下性能优势越明显
    使用建议:
    1)在非多线程的情况下,应当尽量使用TreeMap
    2)对于并发性相对较低的并行程序可以使用Collections.synchronizedSortedMap将TreeMap进行包装
    3)高并发程序,应当使用ConcurrentSkipListMap,能够提供更高的并发度。

    五 信号量 Semaphore

    Semaphore

    通常用于限制可以访问某些资源(物理或逻辑的)的线程数目
    默认为非公平信号量

    六 同步辅助类

    CountDownLatch

    基于共享锁模型
    一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。
    用给定的计数 初始化 CountDownLatch。由于调用了 countDown() 方法,所以在当前计数到达零之前,await 方法会一直受阻塞。

    CyclicBarrier

    它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)

  • 相关阅读:
    IP的幻觉
    糟糕的一天
    windows下批量生成文件
    基于Bandersnatch搭建本地pypi源
    vmware vsphere 无法启动故障;
    关于Centos7客户端代理配置
    怎样在交换机判断是否出现环路了呢?
    小小的网络故障
    express for LINUX
    ESXI 7.0 ovf 导出;
  • 原文地址:https://www.cnblogs.com/amei0/p/8522006.html
Copyright © 2011-2022 走看看