摘要
本博文将详细的介绍的AQS的底层原理和源码分析。帮助大家更加全面的学习和了解的AQS的底层源码。
一、可重入锁(递归锁)可重入锁又名递归锁:是指在同一个线程在外层方法获取锁的时候,再进入该线程的内层方法会自动获取锁(前提,锁对象得是同一个对象),不会因为之前已经获取过还没释放而阻塞。Java中ReentrantLock和synchronized都是可重入锁,可重入锁的一个优点是可一定程度避免死锁。
一个线程中的多个流程可以获取同一把锁,持有这把同步锁可以再次进入。自己可以获取自己的内部锁。
- 隐式锁(即synchronized关键字使用的锁)默认是可重。
- Synchronized的重入锁的实现机理。
- 显式锁(即Lock)也有ReentrantLock这样的可重入锁。
package com.zhuangxiaoyan.java.base.javabase.AQS;
/**
* @Classname ReentrantLockTest
* @Description TODO
* @Date 2022/5/23 22:34
* @Created by xjl
*/
public class ReentrantLockTest {
static Object objectLockA=new Object();
public static void m1(){
new Thread(()->{
synchronized (objectLockA){
System.out.println(Thread.currentThread().getName()+"\t"+"-------------外层调用");
synchronized (objectLockA){
System.out.println(Thread.currentThread().getName()+"\t"+"-------------中层调用");
synchronized (objectLockA){
System.out.println(Thread.currentThread().getName()+"\t"+"-------------内层调用");
}
}
}
},"t1").start();
}
public static void main(String[] args) {
m1();
}
}
package com.zhuangxiaoyan.java.base.javabase.AQS;
/**
* @Classname ReentrantLockTest2
* @Description TODO
* @Date 2022/5/23 22:43
* @Created by xjl
*/
public class ReentrantLockTest2 {
public static synchronized void m1(){
System.out.println("====外");
m2();
}
public static synchronized void m2(){
System.out.println("====中");
m3();
}
public static synchronized void m3(){
System.out.println("====内");
}
public static void main(String[] args) {
m1();
}
}
LockSupport是用于创建锁和其他同步类的基本线程阻塞原语。线程等待唤醒机制。
AQS抽象的队列同步器,
尚硅谷Java大厂面试题全集(java面试,周阳主讲)-Java面试_大厂高频面试题_阳哥_哔哩哔哩_bilibili