写点什么

AQS 知多少

用户头像
卢卡多多
关注
发布于: 2 小时前
AQS知多少

AQS:

LockSupport:AQS 的底层支持

JUC-->AQS-->LockSupport

1.可重入锁:(递归锁)

java.util.concurrent,atomic.Lock;ReentrLock;
复制代码

可重入锁--是指,同一个线程获取到外层的锁对象之后,如果内层方法中的锁对象和外层的一致,可自动进入的一个过程;(不会因为之前已经拥有锁未释放,就阻塞)

一般锁的逻辑是,对于将要改变的数据,进行细节过程化分,

2.解析锁的使用过程:

首先两个对象去,直接去家里,a 先去获取到钥匙,直接进入,但是这里原子性的操作,当 A 获取到锁对象时候,B 只能在外面等,等到 A 对象将锁(释放了之后,意思是解锁了以后,)、B 对象才可以使用,这既是一个简单地锁对象的过程;从抢占--->释放的过程;一个线程中多个流程可以获取同一把锁,持有这把同步锁可以再次进入;

3.可重入锁的分类:

  • 隐式锁:synchronized,基于 JVM 层面的,对于锁对象,都是隐藏起来的,加锁和解锁;

  • 显示锁:以 Lock 的实现类,ReentrantLock ,(可以自由的加锁和释放锁,也是比较好的操作性更好;) ReentrantLock

package java.util.concurrent.locks;public class ReentrantLock implements Lock, java.io.Serializable {    private static final long serialVersionUID = 7373984872572414699L;    /** Synchronizer providing all implementation mechanics */    private final Sync sync;
复制代码

证明 Synchronzied 是一个可重入锁:

package com.atguowang.thirdinterview.juc;
/** * @author webstart * @time 2020/10/26/10:41 * @description  synchronized中对于可重入锁的验证 **/public class TestSyn {     //老伙计-线程操作资源类

    static Object dataTest=new Object();
    //    static void  m1(){       new Thread(()->{          synchronized (dataTest){ System.out.println(Thread.currentThread().getName()+"\t"+"外层区域"); }          synchronized (dataTest){ System.out.println(Thread.currentThread().getName()+"\t"+"中层区域");}          synchronized (dataTest){ System.out.println(Thread.currentThread().getName()+"\t"+"中层区域");}          },"lucas").start();
    }
    public static void main(String[] args) {        m1();    }
}

复制代码

同步方法的展示:

package com.atguowang.thirdinterview.juc;
/** * @author webstart * @time 2020/10/26/10:41 * @description  synchronized中对于可重入锁的验证:同步方法 **/public class TestSyn2 {
    public  synchronized void m1(){         //打印          System.out.println("外");          m2();    }
    public  synchronized void m2(){        //打印        System.out.println("中");        m3();    }
    public  synchronized void m3(){        //打印        System.out.println("内");
    }
    public static void main(String[] args){
        new TestSyn2().m1();    };    }

复制代码

使用字节码文件去查看 synchronized 的运行过程;


ReentrantLock 的显示的可重入锁的工作原理:

特别注意:

如果说,加锁的次数和,解锁的次数都是不匹配的,就会导致,当前线程结束后,我们无法获取到锁对象,导致死锁,数据请求失败等问题;

发布于: 2 小时前阅读数: 2
用户头像

卢卡多多

关注

努力寻找生活答案的旅途者 2020.04.12 加入

公众号:卢卡多多,欢迎一起交流学习

评论

发布
暂无评论
AQS知多少