• JAVA CONCURRENT FRAMEWORK


    1.ConcurrentHashMap

      在并发中使用hashmap容易导致死锁,hashmap存在以下问题

      1.线程不安全的hashmap

        在多线程环境下使用hashmapPut操作时会引起死循环,因为多线程会导致HashMap的Entry链表形成环形数据结构,next节点永远不为控股,就会产生死循环

      2.效率低下的HashTable

        HashTable利用synchronized来保证线程安全,但在竞争情况下会产生阻塞和轮询状态而导致效率降低

      所以根据以上情况ConcurrentHashMap通过锁分段技术来提高并发效率

      将数据进行分段,当一个线程占有占用锁访问其中一个分段数据时,其他都按的数据也能被其它线程访问

     2.ConcurrentHashMap结构

       ConcurrentHashMap由Segment和 HashEntry组成,Segment是可重入锁,HashEntry用于存储键值对数据,一个ConHashMap包含一个Segment数组,每个HashEntry是一个链表结构元素,  

      ConcurrentHashMap结构

     3.使用

      初始化通过InitialCapacity,LoadFactor和concurrencyLevel来初始化数组

     定位Segemt

        ConcurrentHashMap使用分段锁来保护不同段的数据,所以在插入和获取元素时,需要通过散列算法定位Segement

    4.操作ConcurrentHashMap

      4.1get

      

     由于将值得共享变量定义为volatile,能够在线程之间保持可见性,能够在多线程时读,并且保证不会读到过期的值在get方法中只需要读不需要写count和value,所以不用加锁,因为JAVA内存的happen-before原则对volatile字段的写入操作先于读操作,所以get能拿到最新的值.

    4.2put

     

       在操作共享变量时必须加锁,PUT首先定位到Segement,然后再Segement执行插入操作,插入操作需判断是否对HashEntry数组是否扩容,在定位元素位置.

    4.3Size

      

    用于计算ConcurrentHashMap元素大小.

    5.ConcurrentLinkedQueue

      线程安全队列,实现安全队列可通过阻塞算法和非阻塞算法,阻塞算法队列通过一个锁和两个锁实现,非阻塞锁通过循环CAS实现。

    ConcurrentLinkedQueue是一个基于链接节点的无界线程安全队列,采用FIFO的规则对结点进行排序,采用WAIT-FREE算法实现,有tail和head节点组成,每个节点指向NEXT的引用组成,节点和节点之间通过next关联

    transient:对象序列化时,阻止对象持久化,修饰变量不能持久化

    5.1入队列

      将入队节点添加到队列尾部

     定位尾节点

      tail节点不总是尾节点,所以每次入队都必须想通过tail节点来找到尾节点.

    出队列

    出队列从队列返回一个节点元素,并清除该节点对元素的引用

     首先获取头节点元素,然后判断节点元素是否存在,不过不为空以CAS方式将头节点的引用设置为NULL,如果CAS成功,则直接返回头节点的元素

    5.2.阻塞队列

      阻塞队列支持两个附加操作的队列,两个附加操作支持阻塞插入和移除

      1.但队列满时,队列会阻塞插入元素的线程,直到不满

      2.移除指队列为空时,获取元素的线程会等待队列变为非空.

     在JDK7中包含7个阻塞队列如下

     

    Queue Detail
    ArrayBlockingQueue 利用数组实现的有界队列按照FIFO原则对元素进行排序,默认情况下不保证线程公平的访问队列
    LinkedBlockingQueue 用链表实现的有界阻塞队列,此列的默认值和最大长度为Integer.MAX_VALUE,FIFO进行排序
    PriorityBlockingQueue 支持优先级的无界阻塞队列,采取顺序升序排列,可以自定实现CompareTo()方法来指定元素排列
    DelayQueue 支持延时获取元素的无界阻塞队列,使用PriorityQueue实现,必须实现Delayed接口,利用Delayed实现缓存系统的设计以及定时任务调度.
    SynchronusQueue 不存储元素的阻塞队列,每一个put操作必须等待一个take操作,支持公平访问队列,默认情况下线程采用非公平策略访问队列
    LinkedTransferQueue 由链表结构组成的无界阻塞TransferQueue队列,
    LinkedBlockingDeque 链表结构双向阻塞结构,可以两段插入和移除元素.可以防止过度膨胀,运用在"工作窃取"模式中

    l

  • 相关阅读:
    实现RHEL下KVM虚拟化
    SELinux安全扩展
    配置用户和组信息
    系统级计划任务
    syslog系统日志服务
    VNC远程连接,虚拟网络计算
    系统初始化
    备份与还原文件系统
    使用对象在方法间共享属性
    Python中*和**的使用
  • 原文地址:https://www.cnblogs.com/EraserHead/p/6473008.html
Copyright © 2020-2023  润新知