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

线程基础(二十八)

作者: 叩丁狼教育 | 来源:发表于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接口的对象)。

相关文章

  • 线程基础(二十八)

    本文作者:王一飞,叩丁狼高级讲师。原创文章,转载请注明出处。 到这, 线程的并发容器介绍就完成了, 来做一个大总结...

  • Java基础

    Java基础 集合基础 集合框架 多线程基础 多线程框架 反射 代理 集合基础 ArrayList LinkedL...

  • Java-并发编程知识点总结

    目录: 线程基础 线程池 各种各样的锁 并发容器 原子类 Java 内存模型 线程协作 AQS 框架 一、线程基础...

  • 年薪50W阿里P7架构师必备知识:并发+JVM+多线程+Nett

    并发编程 线程基础、线程之间的共享和协作一 线程基础、线程之间的共享和协作二 线程的并发工具类 线程的并发工具类、...

  • Java多线程总结 之 基础概念

    基础概念 序言 线程知识结构图 线程基础 什么是线程: 线程和进程的区别: 什么是同步: 并发和并行的区别: 什么...

  • 线程-线程基础

    创建线程 new Thread(?).start() ?可以是2种。 runable接口的实现类 也可以继承Thr...

  • Android中的多线程

    1. Java多线程基础 Java多线程,线程同步,线程通讯 2. Android常用线程 HandlerThre...

  • 多线程方法

    一. 基础并行多线程结构 二. 标准多线程方法,控制并发线程数,带线程锁

  • 线程池

    线程池种类 ThreadPoolExecutor 基础线程池 线程执行任务过程 当前执行线程数 < corePoo...

  • NSThread三种创建线程的方法

    对耗时操作的理解 NSThread基础 线程控制 线程安全 线程间同行

网友评论

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

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