线程间通讯,能随意控制线程的执行顺序,实现方式
- 同步锁机制如关键字:synchronized、lock;
- wait、notify机制来具体实现
- join关键字控制先后顺序
- 单一线程池(newSingleThreadExecutor)因为该线程池每次最多只能消费一个线程,其它线程在阻塞队列中
- CountDownLatch;CyclicBarrier;Semaphore
线程安全,不管多少线程、怎么执行,得到的结果都是意料中的结果;参考原则:
- happens-before(先行发生原则):如果(A)happens-before(B)那么A的操作结果对B可见,并且A在B之前操作
- as-if-serial:不管怎么重排序,程序的执行结果不被改变(为了提高性能,编译器、处理器通常会对指令做重排序)
- 顺序一致性:一个线程中所有操作必须按照程序的顺序执行;所有线程只能看到一个单一的操作执行顺序,每个操作都必须原子执行并且结果对多有线程立即可见
synchronized关键字:
AbstractQueuedSynchronizer:(队列同步器,简称AQS)
- AQS使用一个int成员变量标识同步状态,当变量为0时说明没有线程获取到锁,不为0时说明有线程获取到锁也就是:也就是通过独占式状态获取与释放来实现锁
- 具体实现:AQS内部使用一个FIFO(先进先出)队列进行状态管理,线程进来后会通过cas方式去更新状态,如果更新失败说明有线程获取到锁,此时会生成一个Node(具体结构可看源码)放入队列尾部并进行自旋等待,直到前一个节点的出队列或者中断后本停止自旋修改状态获得锁
CAS(CompareAndSwap):比较后交换
- CAS(A,B,C)有三个参数值,A:要变更的旧值,B:期望的值,C:新值;过程是:查询旧的值A跟B做对比如果相等直接将A修改成C如果不相等进入自旋重新查询A跟B比较
- 适用场景:对于资源竞争比较少的情况可使用,先对资源竞争比较大的情况长时间自旋会消耗CPU资源
- 缺陷:ABA现象
- ABA解决方案:1、可通过地址对比;2、可通过乐观锁比如加version进行对比
公众号主要记录各种源码、面试题、微服务技术栈,帮忙关注一波,非常感谢