五、线程并发高级部分之多线程之间交互:线程阀

概念:线程与线程之间相互制约和相互交互的机制。

1. 阻塞队列BlockingQueue。

1.1 Queue(队列):保存一组元素,先进先出的线性表,队头删除,队尾插入。

1.2 Deque(双端队列\栈):两端都可以进出的队列。先进后出。

阻塞队列:存储和删除操作会等待队列可用时进行操作。常用于生产者和消费者情景,生产者存放元素的容器,消费者读取元素的容器。请添加图片描述

2. 数组阻塞队列ArrayBlockingQueue

概念:由数组支持的有界的阻塞队列,(FIFO)先进先出对元素进行排序存储。有界缓存,一旦创建缓存区,就不能再增加容量,已满或空队列进行插入和删除会受阻塞。提供生产者消费者等待公平策略。需要设置公平性为true,但是会降低吞吐量。源码使用的是ReentrantLock可重入锁。

3. 链表阻塞队列LinkedBlockingQueue

概念:存在缓冲区,达到最大值时(默认无限大小Integer.MAX_VALUE)才阻塞生产队列,直到消费掉一部分才被唤醒。反之亦然。对生产端和消费端分别采用独立锁控制数据同步。

4. 优先级阻塞队列PriorityBlockingQueue

概念:支持优先级排序的无界阻塞队列,没有可消费数据时不阻塞生产者,阻塞消费者,使用时生产速度不能快于消费速度。内部线程采用公平锁。

5. 延时队列DelayQueue

创建元素时可以指定多久才能从队列中获取当前元素。必须实现Delayed接口和Comparable接口。使用场景:缓存系统的设计;定时任务调度。

6. 同步队列SynchronousQueue

不存储元素,直接将生产者线程处理的数据直接传给消费者线程。可以使用公平模式和非公平模式声明,默认非公平模式。后者生产和消费速度存在差异的情况下容易出现饥渴现象。

7. 链表双向阻塞队列 LinkedBlockingDeque

可以从队列两段插入和移除元素。与其他的区别是可以获取和移除双端队列的最后一个元素。可以设置容量防止过度膨胀,可以运用在工作窃取模式中。

8. 链表传输队列 LinkedTransferQueue

链表组成的无界阻塞队列,采用双重数据结构(保留和完成)。保留:消费者读取队列时发现为空,会生成空元素放入队列然后继续等待,直到生产者放入元素填充这个空元素完成元素的填充。

9. 同步计数器 CountDownLatch

利用AQS的state状态来实现Count的阻塞机制。在完成一组正在其他线程执行的操作之前,允许一个或多个线程一直等待。一个或多个线程,等待另外N个线程完成某个事情之后才能执行。

10. 抽象队列化同步器 AbstractQueuedSynchronizer

排他模式和共享模式。

11. 同步计数器 Semaphore

计数信号量,类似排队机制,放进去几个,等这几个完事再放入下一波。void acquire():从此信号量获取一个许可,提供许可前线程一直阻塞;void release:释放许可,将其返回给信号量。试用场景:排队等待的房间或者资源有限的群等等,常见的线程池、连接池。

12. 同步计数器 CyclicBarrier

同步辅助类,允许一组线程相互等待,直到到达某个公共屏障点,然后所有这组线程再同步往后执行。多个线程一起循环到这个点,再一起执行后面。N个线程相互等待,任何一个线程完成之前,所有线程都必须等待。利用ReentrantLock做线程安全锁。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值