美文网首页
线程基础(二十八)

线程基础(二十八)

作者: 叩丁狼教育 | 来源:发表于2019-08-26 17:15 被阅读0次

    本文作者:王一飞,叩丁狼高级讲师。原创文章,转载请注明出处。

    到这, 线程的并发容器介绍就完成了, 来做一个大总结:

    List集合
    SynchronizedList :一个由普通list转换而来的线程安全集合

    List list = Collections.synchronizedList(new LinkedList(...));

    CopyOnWriteArrayList :一种读写安全的ArrayList集合

    CopyOnWriteArrayList类是线程安全的容器,但它的安全是有一定的限制的。他的线程安全操作针对是并发环境下线程读与写安全。简单的讲, 它只能保证, 一边线程主读(遍历/获取), 一边线程主写(添加/删除/修改)操作上的安全。如果一边线程读写复合操作,另一边线程也读写复合操作,那它也无能为力啦。

    Map集合
    SynchronizedMap:一个由普通Map转换而来的线程安全map集合

    Map synchronizedMap = Collections.synchronizedMap(new HashMap());

    ConcurrentHashMap:jdk7以前:一种将Map分段(Segment)锁定的线程按照Map jdk8以后:一种使用Node + CAS + Synchronized 保证安全的Map

    jdk7以前:
    ConcurrentHashMap和HashMap设计思路差不多,但是为支持并发操作,做了一定的改进,ConcurrentHashMap引入Segment 的概念,目的是将map拆分成多个Segment(默认16个)。操作ConcurrentHashMap细化到操作某一个Segment。在多线程环境下,不同线程操作不同的Segment,他们互不影响,这便可实现并发操作。
    jdk8以后:
    jdk8版本的ConcurrentHashMap直接抛弃了Segment的设计,采用了较为轻捷的Node + CAS + Synchronized技术组合设计,保证线程安全。

    Queue队列
    阻塞类:
    ArrayBlockingQueue :一个由数组结构组成的有界阻塞队列。

    ArrayBlockingQueue 底层是一个有界数组,遵循FIFO原则,对进入的元素进行排序,先进先出。其使用ReentrantLock锁,再配合两种Condition实现队列的线程安全操作。并发环境下ArrayBlockingQueue 使用频率较高,另外,其还支持公平与非公平2种操作策略,在创建对象时通过构造函数将fair参数设置为true/false即可,需要注意的是,如果fair设置为false,表示持有公平锁,这种操作会降低系统吞吐量,慎用。

    LinkedBlockingQueue :一个由链表结构组成的有界阻塞队列。

    LinkedBlockingQueue 一个基于链表而实现的有界阻塞队列。遵循先进先出原则,由队头入列,再从队尾出列。具体操作上跟ArrayBlockingQueue类似,区别在于底层维护数据上,LinkedBlockingQueue底层是一个链接,而ArrayBlockingQueue是一个数组。

    LinkedBlockingDeque:一个由链表结构组成的双向阻塞队列。

    LinkedBlockingDeque 跟LinkedBlockingQueue 实现原理一样,区别是它是双向的

    PriorityBlockingQueue :一个支持优先级排序的无界阻塞队列。

    PriorityBlockingQueue 是有一个带有优先级级别的无界阻塞队列,不支持null元素入列,并且要求队列对象必须为可以比较对象。这点跟PriorityQueue类 类似,区别是PriorityBlockingQueue 带有阻塞功能。

    DelayQueue:一个具有延时等待效果无界阻塞队列。

    DelayQueue一个无界阻塞队列,里面元素都实现Delayed接口,要求实现延期策略方法(getDelay)。在操作队列时,只有在延迟期满时才能从队列中提取元素。如果所有元素延迟都还没有期满,则队列没有头部,使用poll时将返回 null。当元素到期,而该元素不是头部元素,继续等待.

    SynchronousQueue:一个不存储元素的阻塞队列。

    SynchronousQueue一个不存储元素的阻塞队列,支持公平锁和非公平锁.每一次操作必须配置,即一次put操作必须等待一次take操作,否则不能添加元素。

    非阻塞类:
    ConcurrentLinkedQueue:一个基于链表的无界线程安全的队列

    ConcurrentLinkedQueue 是一个基于链接节点的无界线程安全的队列,按照先进先出原则对元素进行排序。新元素从队列尾部插入,而获取队列元素,则需要从队列头部获取。

    PriorityQueue:一个基于优先级的无界线程不安全队列

    PriorityQueue 一个基于优先级的无界优先级队列。优先级队列的元素按照其自然顺序进行排序,或者根据构造队列时提供的 Comparator 进行排序,具体取决于所使用的构造方法。该队列不允许使用 null 元素也不允许插入不可比较的对象(没有实现Comparable接口的对象)。

    相关文章

      网友评论

          本文标题:线程基础(二十八)

          本文链接:https://www.haomeiwen.com/subject/ucydectx.html