4) 2021-11-17 学习记录,以面试回答口吻记录,拒绝八股 Condition,J.U.C 中的阻塞队列(个人总结用)

一.Condition
有wait和notify衍生而来,类似
区别在于wait 和 notify应用于Synchronized中,而condition的await和signal应用与lock的并发场景中,而且可以唤醒指定线程,而notify不能
等待队列存储等待中的线程,唤醒等待中的线程,AQS同步队列和Condition等待队列的线程的转移
Condition实现原理
await
1.释放锁
2.让释放锁的线程被阻塞
3.被阻塞之后要存储到队列之中
4.重新去竞争锁
5.能正确处理中断interrupt的响应
signal
把被阻塞的队列中的线程先唤醒 signal,signalAll
把等待队列中被唤醒的队列转移到AQS队列中
Condition实际应用
实现阻塞队列,线程池中会用到阻塞队列,生产者消费者 ,流量缓冲
阻塞队列
队列是只允许在对头删除节点,在队尾插入节点的一种线性表
1.阻塞插入,队列满了,阻塞线程直到,队列中有元素被移除
2.阻塞移除,队列为空,阻塞线程直到,队列中有元素被添加
阻塞队列的方法
添加元素
add(满了抛出异常)
offer ->true/false 成功,失败
put 如果满了一直阻塞
offer(timeout),如果满了,超过超时时间,返回false
移除元素
element ->队列为空
peek ->true/false 移除返回true/否则false
take 一直阻塞
(timeout)如果超时,没有元素,返回null

二.J.U.C 中的阻塞队列
pollArrayBlockingQueue 基于数组结构

LinkedBlockingQueue 基于链表结构

PriorityBlcokingQueue 基于优先级队列

DelayQueue 允许延时执行的队列

SynchronousQueue 没有任何存储结构的的队列

newCachedThreadPool.
new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue());

猜你喜欢

转载自blog.csdn.net/qq_45095838/article/details/121390112