Java高并发之AQS详解

代码仓库:https://gitee.com/DP_zhouyang/concurrentDemo.git

1.CountDownLatch

源码解析:https://blog.csdn.net/qq_38293564/article/details/80557355
在这里插入图片描述

final CountDownLatch countDownLatch = new CountDownLatch(clientTotal);//请求总数
countDownLatch.countDown();//减少
countDownLatch.await();//等待通知组

有一个计数器,对计数器的操作是原子的。在这里插入图片描述
在这里插入图片描述
在某些场景中,需要等待程序完成某些条件后才能实现接下来的操作。
在这里插入图片描述
在这里插入图片描述
其中设置了deadTime
在这个时间范围内,会不断尝试获取队列头的锁,而CountDownLatch是通过一个状态states来判断是否成功获取锁的。它会一直自旋直到拿到这个状态。
在这里插入图片描述

2.Semaphore

源码解析:https://blog.csdn.net/u010144805/article/details/79787895
可以控制某个资源在同一时刻被访问的限制。
常用使用场景:并发访问控制,如数据库连接。
在这里插入图片描述
默认采用非公平抢占获取锁,否则加入等待队列,底层依旧是使用CAS同步机制。

3.CyclicBarrier

源码详解:https://blog.csdn.net/qq_38293564/article/details/80558157

用这个类可以实现多个线程相互等待,直到它们都就绪后才能进行下面的操作。
与CountDownLatch类似,有一个计数器。
区别
1)CyclicBarrier的计数器可以重置,但是CountDownLatch不能。
2)CountDownLatch是一个或者N个线程等待其它某些线程完成操作,而CyclicBarrier是多个线程之间相互等待,直到所有线程都满足。所以可以处理更加复杂的场景,如出现错误了,可以重新计数等,也可以获取阻塞的线程数量等。
在这里插入图片描述
可见该类的实现借助了ReentrantLock和Condition,每个线程使用await()方法告诉CyclicBarrier我已经到达了屏障,然后当前线程被阻塞,直至屏障到达一定数量被打开,然后被屏障数被重置。
在这里插入图片描述
在屏障被打破时,除了重置当前线程数目,还唤醒线程。

4.ReentrantLock

与Synchronized的区别
虽然都是通过锁计数器实现的可重入性,但是Synchronized是依赖于JVM实现的,但是ReentrantLock是基于JDK实现的,总的来说就是代码和操作系统的锁粒度。
在用户态就把锁解决,避免进入内核态,从而避免线程阻塞。
具体区别:https://www.cnblogs.com/cxzdgs/p/5746895.html

在这里插入图片描述

5.Condition

Lock中的Condition可以实现唤醒/通知模式,await方法可以实现丢弃锁然后将自己加入等待队列的功能。

具体解析:http://www.importnew.com/30150.html

是多个线程互相通信的重要工具。

6.FutureTask

无论是使用Runnable还是Thread启动线程,都有一个无法避免的缺陷,就是线程执行完后无法获取线程执行的结果。

Runnable和Callable的区别
在这里插入图片描述

7.Fork/Join框架

在这里插入图片描述

8.BlockingQueue

只有以下两个操作会导致阻塞队列的阻塞。
1.队列满了增加元素。
2.队列空了要倒出元素。
在这里插入图片描述
有以下实现了BlockingQueue
1.ArrayBlockingQueue 数组实现 数组大小一旦声明不可改变
2.DelayQueue 排序了的 默认按过期时间排序
3.LinkedBlockingQueue 用链表实现 长度默认无限大 也可以指定长度 先进先出
4.PriorityBlockingQueue 带优先级的队列,没有边界,可以插入null,所有插入的元素必须实现了Comparable接口,然后按照compare规则排序。
5.SynchronousQueue 只能插入一个元素,插入就被阻塞,除非这个元素被其它线程消费。又称为同步队列。

9.线程池

详细解读:https://blog.csdn.net/u010963948/article/details/80573898
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
三者关系:如果当前线程小于corePoolSize,直接创建新线程来执行任务,即使线程池中其它线程池是空闲的。不然只有当workQueue满的时候,才会创建新的线程来执行任务。
在这里插入图片描述
四种创建线程池的方式:在这里插入图片描述
五种拒绝处理任务的策略:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

10.多线程实践与Spring多线程开发

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

11.并发编程集合使用补充

后续更新中…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值