9.并发基础与CAS基本原理

线程的状态/线程的生命周期

  • 初始化 Thread thread = new Thread();
  • 运行 thread.start();
    • 运行中状态 ——> 调用yeild进入就绪状态
    • 就绪状态 ——> 通过系统调度(获取到cpu时间片),又会进入到运行中状态
  • 等待
    调用如下方法就从运行进入到等待状态:
    Object.wait()、Object.join()、LockSupport.park();
    在调用如下方法后,又会从等待状态进入到运行状态:
    Object.notify()/notifyAll()、LockSupport.unpark(thread)
  • 等待超时
    调用如下几个方法执行时间超时后就会进入到运行状态:
    Object.wait(1000)、Object.join(1000)、Thread.sleep(1000)、LockSupport.parkNanos()、 LockSupport.parkUntil();
  • 阻塞
    多个线程等待获取到synchronized同步锁,此时这些等待的线程就是阻塞状态,获取到锁后就会从阻塞状态进入到运行中状态
  • 终止
    线程执行完成

死锁产生的必要条件(需要同时满足)

  • 多个操作者争夺多个资源
  • 争夺资源的顺序不对
  • 拿到资源不放手
  1. 互斥
  2. 请求和保持
  3. 不剥夺
  4. 环路等待

如何打破死锁?

  • 申请足够的资源
  • 保证争夺资源的顺序正确,让多个线程同时去竞争同一个资源
  • 通过Lock的tryLock和unLock方法去操作,活锁去执行.

CAS (Compare And Swap)
什么是原子操作?
要么全部完成,要么全部都不做,不可再分
如何实现原子操作?
使用锁

CAS原理
利用了现代处理器都支持的CAS指令,循环这个操作,直至成功为止
CAS执行流程图

CAS的问题

  • ABA问题 (在结果相同的情况下中间可能有做过别的操作,可以通过版本戳来解决)
  • 开销问题 (不停的循环会造成cpu开销问题,可以改用加锁机制解决)
  • 只能保证一个共享变量的原子操作 (使用范围比较局限,可以将多个变量构造成一个对象来处理)

CAS的使用
AtomicBoolean、AtomicInteger、AtomicLong等等

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值