AQS、CAS,CAS的ABA问题,JUC工具类

本文探讨了Java并发工具AQS(AbstractQueuedSynchronizer)的基础概念,包括其在锁和同步容器中的应用,以及CAS(Compare-and-Swap)的原理和ABA问题的解决方案。还介绍了JUC(Java.util.concurrent)下的CountDownLatch、CyclicBarrier和Semaphore等工具类的作用。
摘要由CSDN通过智能技术生成

1.什么是AQS

        是一个用于构建锁和同步容器的队列同步器,是整个JUC包下lock体系的核心。如ReentrantLock、ReentrantReadWriteLock、CountDownLatch、Semaphore都是基于它来实现的,它解决了在实现同步容器时设计的大量细节问题,它的核心构成部分为:使用一个 先进先出的FIFO的队列存储排队等待锁的线程,使用一个用volatile修饰的int类型的state同步状态来记录当前是否有线程持有锁,0表示没有线程获得锁,1表示有,上锁state就加1,释放锁就对应减1,有重入锁现象,这个值就大于1,然后需要逐级去释放。

2.什么是cas?

        cas就是乐观锁的一种实现方式

       ABA问题:

                1.线程1读取指定内存地址的数据A,加载到寄存器,此时读取出来的值不仅会作为要被计算的值A,还会作为比较值A

                2.此时线程1的cpu被线程2抢占了,线程2也从同样的内存地址中读取了同样数据的A,线程2比线程1先执行完,线程2产生了新数据B

                并且根据CAS原理把B存入该内存地址(内存的值由A被改为B)

                3.还没完,线程2执行完成后,线程1又没抢到线程,此时cpu被线程3抢占,线程3读取到数据B,线程3比线程1先执行完,线程3产生了新数据A,值与一开始的A相等,但值相等就意味着相等,此时内存又从B变为A

                4.这个时候线程1执行完了,根据cas原理存入数据,然后比较值A是原来的A,而执行内存中的A已经被替换了,但原A的值与内存中的A值是相等的,根据cas线程1会把新的执行结果存入内存地址,在实际业务,两个数的值相等,但这两个数并不是同一个数

        解决方案:加个版本号,比较版本号

3.JUC下的工具类

        CountdownLatch:利用他实现类似计数器的功能

        Cyclicbarrier:通过它可以实现让一组线程等待至某个状态之后再全部同时执行

        Simephore:信号量,Sem、aphore可以控同时访问的线程个数,通过 acquire() 获取一个许可,如果没有就等待,而 release() 释放一个许可

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值