多线程笔记(十一):JUC 之 Lock、AQS、CAS 原理分析

1.JUC介绍

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

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

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


2.Lock锁介绍

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

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

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

   Lock 和 synchronized 区别

                                   Lock                                     synchronized
层次方面

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

②JDK 层次的实现

①是 Java 关键字

②在 JVM 层次定义的

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

释放锁、获得锁是被动的

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

          ②抛出异常,同步器执行 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有关联,在一起介绍)

发布了247 篇原创文章 · 获赞 44 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/lzb348110175/article/details/103693415