多线程相关

线程间通讯,能随意控制线程的执行顺序,实现方式

  1. 同步锁机制如关键字:synchronized、lock;
  2. wait、notify机制来具体实现
  3. join关键字控制先后顺序
  4. 单一线程池(newSingleThreadExecutor)因为该线程池每次最多只能消费一个线程,其它线程在阻塞队列中
  5. CountDownLatch;CyclicBarrier;Semaphore

线程安全,不管多少线程、怎么执行,得到的结果都是意料中的结果;参考原则:

  1. happens-before(先行发生原则):如果(A)happens-before(B)那么A的操作结果对B可见,并且A在B之前操作
  2. as-if-serial:不管怎么重排序,程序的执行结果不被改变(为了提高性能,编译器、处理器通常会对指令做重排序)
  3. 顺序一致性:一个线程中所有操作必须按照程序的顺序执行;所有线程只能看到一个单一的操作执行顺序,每个操作都必须原子执行并且结果对多有线程立即可见

synchronized关键字:

这里写图片描述

AbstractQueuedSynchronizer:(队列同步器,简称AQS)

  1. AQS使用一个int成员变量标识同步状态,当变量为0时说明没有线程获取到锁,不为0时说明有线程获取到锁也就是:也就是通过独占式状态获取与释放来实现锁
  2. 具体实现:AQS内部使用一个FIFO(先进先出)队列进行状态管理,线程进来后会通过cas方式去更新状态,如果更新失败说明有线程获取到锁,此时会生成一个Node(具体结构可看源码)放入队列尾部并进行自旋等待,直到前一个节点的出队列或者中断后本停止自旋修改状态获得锁

CAS(CompareAndSwap):比较后交换

  1. CAS(A,B,C)有三个参数值,A:要变更的旧值,B:期望的值,C:新值;过程是:查询旧的值A跟B做对比如果相等直接将A修改成C如果不相等进入自旋重新查询A跟B比较
  2. 适用场景:对于资源竞争比较少的情况可使用,先对资源竞争比较大的情况长时间自旋会消耗CPU资源
  3. 缺陷:ABA现象
  4. ABA解决方案:1、可通过地址对比;2、可通过乐观锁比如加version进行对比

公众号主要记录各种源码、面试题、微服务技术栈,帮忙关注一波,非常感谢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值