JUC 之 Lock、AQS、CAS 原理分析

1.JUC介绍

       在Java中,线程部分是一个重点,当前介绍的 JUC 也是关于线程的。

       在 JDK 1.5 提供了 java.util .concurrent 工具包(简称:JUC),这是一个处理线程的工具包,下面一起来看看它怎么使用。JUC 包增加了在并发编程中很常用的工具类,用于定义类似于线程的自定义子系统,包括线程池、异步 IO 、轻量级任务框架;还提供了设计用于多线程上下文中的 Collection 实现等。

       JUC工具包的出现,目的就是为了更好的支持高并发任务,让开发者利用这个包进行的多线程编程时可以有效的减少竞争条件和死锁线程。

图片Xmind下载地址:https://pan.baidu.com/s/1apSydPeXgRgfbxRAlX0pwA (提取码:pwyl )


2.Lock锁介绍

       当多个线程需要同时访问某个公共资源时,我们需要通过加锁的操作来保证线程的安全。

       除了 synchronized 关键字这种方式外,JUC 工具包还为我们提供了 Lock 接口来实现锁的功能,并且还提供了更灵活的API来方便我们调用。

       既然要学习 Lock 锁,不妨先来看看它们之间的区别吧

   Lock 和 synchronized 区别

                                 Lock                                    synchronized
层次方面

①Lock 是一个接口,是在类级别上的实现

②JDK 层次的实现

①是 Java 关键字

②在 JVM 层次定义的

灵活性方面

Lock 接口提供的 lock() 和 unlock() 方法,可以随时获得锁、释放锁,非常灵活

(Lock 在发生异常时,如果没有主动通过 unLock()去释放锁,则很可能造成死锁现象,因此使用 Lock 时需要在 finally 块中释放锁)

释放锁、获得锁是被动的

释放锁只有两种情况:①同步代码块执行完毕 

          ②抛出异常,同步器执行 monitorexit 释放锁

锁的状态方面

①Lock 可以判断锁的状态

它会提供 tryLock() 方法来告诉我们是否获得锁成功

②tryLock() 方法有返回值,用来尝试获取锁,如果获取成功,则返回true;获取失败,返回false,这个方法无论如何都会立即返回。在拿不到锁时不会一直在那等待。

①在锁的状态方面,synchronized 完全是被动的,没法判断锁的状态。

②synchronized  在拿不到锁时,则会阻塞在那里,一直等待

锁的类型方面

基于 Lock 接口,有多种锁的实现。如:

①可重入锁:ReentrantLock

②可重入读写锁:ReentrantReadWriteLock 等

针对可重入锁,还有 ①公平锁 和 ②非公平锁 之分

对于 synchronized 来说,它只是一个 JVM 层次的关键字,并不是一个接口,没有具体实现。

synchronized 相当于非公平锁。

        既然我们已经知道了 Lock 只是一个接口,那接下来我们来看一下 Lock 接口常用的具体实现吧

 Lock 接口实现类

   1.可重入锁 ReentrantLock

         请跳转链接查看:可重入锁 ReentrantLock

         附:可重入读写锁 ReentrantReadWriteLock,但是它并不是实现 Lock 接口,实现的是 ReadWriteLock  接口,供参考

    可重入锁,主要是基于 AQS 来实现的。接下来我们来了解 这个重要的东西:AQS

3.AQS介绍

       Lock锁之所以能够实现线程安全,主要的核心是 AQS,AQS提供了一个FIFO队列,可以看做是一个用来实现锁以及其他需要同步功能的框架。

       AQS的使用,依赖继承完成,子类需要通过继承AQS,并实现相关的方法来达到同步状态的管理。例如常见的ReentrantLock,CountDownLatch等。

4.AQS原理分析

      请跳转链接查看:AQS 原理分析

5.CAS介绍

     请跳转链接查看:AQS 原理分析(AQS和CAS有关联,在一起介绍)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

扛麻袋的少年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值