AQS知多少

“这是我参与更文挑战的第22天,活动详情查看: 更文挑战

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的显示的可重入锁的工作原理:

特别注意:

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

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享