1. 构建Debug代码:

     1 package com.hl.interview.lock;
    2
    3 import java.util.Scanner;
    4 import java.util.concurrent.locks.Lock;
    5 import java.util.concurrent.locks.LockSupport;
    6 import java.util.concurrent.locks.ReentrantLock;
    7
    8 /**
    9 * @author Hl
    10 * @create 2021/2/20 9:36
    11 */
    12 public class AQS {
    13 static Lock lock = new ReentrantLock();
    14 volatile static int flag = 0;
    15
    16 public static void main(String[] args) {
    17 Scanner scanner = new Scanner(System.in);
    18 Thread a = new Thread(() -> {
    19 lock.lock();
    20 try {
    21 System.out.println(Thread.currentThread().getName() + "先占用了");
    22 LockSupport.park();
    23 } finally {
    24 lock.unlock();
    25 }
    26 }, "A");
    27
    28 Thread b = new Thread(() -> {
    29 LockSupport.park();
    30 // 下面是断点处
    31 System.out.println("开始B线程");
    32 lock.lock();
    33 try {
    34 System.out.println(Thread.currentThread().getName() + "抢占");
    35 LockSupport.park();
    36 } finally {
    37 lock.unlock();
    38 }
    39 }, "B");
    40
    41 Thread c = new Thread(() -> {
    42 LockSupport.park();
    43 // 下面是断点处
    44 System.out.println("开始C线程");
    45 lock.lock();
    46 try {
    47 System.out.println(Thread.currentThread().getName() + "抢占");
    48 LockSupport.park();
    49 } finally {
    50 lock.unlock();
    51 }
    52 }, "C");
    53 a.start();
    54 b.start();
    55 c.start();
    56 System.out.print("请输入一个数:\t" );
    57 while (scanner.hasNextInt()) {
    58 System.out.print("请输入一个数:\t" );
    59 flag = scanner.nextInt();
    60 System.out.println();
    61 if (flag == 1) {
    62 System.out.println("释放了A线程");
    63 LockSupport.unpark(a);
    64 } else if (flag == 2) {
    65 System.out.println("释放了B线程");
    66 LockSupport.unpark(b);
    67 } else if (flag == 3) {
    68 System.out.println("释放了C线程");
    69 LockSupport.unpark(c);
    70 } else {
    71 System.out.println("退出了程序");
    72 break;
    73 }
    74 }
    75 }
    76 }
  2. Debug所有断点处
  3. 流程图,个人理解,有些地方理解的不太透彻望包涵

流程图地址

AQS源码解读(ReentrankLock的公平锁和非公平锁)的更多相关文章

  1. AQS 源码解读之加锁篇

    以 ReentrantLock 创建的非公平锁为基础,进行 AQS 全流程的分析. 分析 demo 一共有 A.B.C 三个线程. public class AQSDemo { // 带入一个银行办理 ...

  2. AbstractQueuedSynchronizer 源码解读(转载)

    转载文章,拜读了一下原文感觉很不错,转载一下,侵删 链接地址:http://objcoding.com/2019/05/05/aqs-exclusive-lock/ Java并发之AQS源码分析(一) ...

  3. java架构之路(多线程)AQS之ReetrantLock显示锁的使用和底层源码解读

    说完了我们的synchronized,这次我们来说说我们的显示锁ReetrantLock. 上期回顾: 上次博客我们主要说了锁的分类,synchronized的使用,和synchronized隐式锁的 ...

  4. 死磕 java同步系列之ReentrantLock源码解析(一)——公平锁、非公平锁

    问题 (1)重入锁是什么? (2)ReentrantLock如何实现重入锁? (3)ReentrantLock为什么默认是非公平模式? (4)ReentrantLock除了可重入还有哪些特性? 简介 ...

  5. AQS源码详细解读

    AQS源码详细解读 目录 AQS源码详细解读 基础 CAS相关知识 通过标识位进行线程挂起的并发编程范式 MPSC队列的实现技巧 代码讲解 独占模式 独占模式下请求资源 独占模式下的释放资源 共享模式 ...

  6. AQS源码深入分析之独占模式-ReentrantLock锁特性详解

    本文基于JDK-8u261源码分析 相信大部分人知道AQS是因为ReentrantLock,ReentrantLock的底层是使用AQS来实现的.还有一部分人知道共享锁(Semaphore/Count ...

  7. AQS源码探究之竞争锁资源

    AQS源码探究---竞争锁资源 我们进入ReentrantLock源码中查看其内部类 Sync 对AQS进行扩展公共方法并定义抽象方法的抽象类 FaireSync 实现公平锁的AQS的实现类 UnFa ...

  8. JUC锁:核心类AQS源码详解

    目录 1 疑点todo和解疑 2 AbstractQueuedSynchronizer学习总结 2.1 AQS要点总结 2.2 细节分析 2.2.1 插入节点时先更新prev再更新前驱next 2.2 ...

  9. 硬核剖析Java锁底层AQS源码,深入理解底层架构设计

    我们常见的并发锁ReentrantLock.CountDownLatch.Semaphore.CyclicBarrier都是基于AQS实现的,所以说不懂AQS实现原理的,就不能说了解Java锁. 上篇 ...

随机推荐

  1. 【noi 2.2_7891】一元三次方程求解(二分枚举+输出程序运行时间)

    对于noi上的题有2种解法: 1.数据很小(N=100),可以直接打for循环枚举和判断. 2.不会"三分",便用二分.利用"两根相差>=1"和 f(x1 ...

  2. codeforces 632F. Magic Matrix (最小生成树)

    You're given a matrix A of size n × n. Let's call the matrix with nonnegative elements magic if it i ...

  3. Codeforces Round #529 (Div. 3) E. Almost Regular Bracket Sequence (思维,模拟栈)

    题意:给你一串括号,每次仅可以修改一个位置,问有多少位置仅修改一次后所有括号合法. 题解:我们用栈来将这串括号进行匹配,每成功匹配一对就将它们消去,因为题目要求仅修改一处使得所有括号合法,所以栈中最后 ...

  4. 牛客编程巅峰赛S1第11场 - 黄金&钻石 A.牛牛的01游戏 (模拟栈)

    题意:有一个\(01\)串,两个相邻的\(0\)可以变成一个\(1\),两个相邻的\(1\)可以直接消除,问操作后的字符串. 题解:数组模拟栈直接撸,上代码吧. 代码: class Solution ...

  5. Mac下anaconda的安装和基本使用

    Mac下anaconda的安装和基本使用 安装 在conda官网下载安装conda. 打开terminal输入conda -V,回车显示conda的版本说明安装成功. 将conda更新到最新版本 co ...

  6. 1054D Changing Array 【位运算+思维】

    题目:戳这里 题意:两个数n,k,满足给的n个数小于2的k次方.每个数可以进行一次操作,即把a[i]换成a[i]^(1<<k-1);求最多的连续区间数使得 区间[L,R] (1<=L ...

  7. 洛谷p2216 多次单调队列,扫描矩阵中的最大值减去最小值最的固定大小子矩阵

    #include <iostream> #include <cstdio> #include <cstring> using namespace std; int ...

  8. git操作是出现Username for 'https://github.com':的验证问题

    Username for 'https://github.com': 输入的是github上的邮箱账号, 而不是github中设置的username, 这是个巨坑!!!Password for 'ht ...

  9. DC1(msf drupal7+suid-find提权)

    这边我们靶机是仅主机模式,IP是192.168.56.101,,直接上msf拿到shell,  不过payload要改一下 改成php/meterperter/bind_tcp 拿到shell了 ,采 ...

  10. 在线可视化设计网站 & 在线编辑器

    在线可视化设计网站 在线编辑器:海报编辑器.H5 编辑器.视频编辑器.音频编辑器.抠图编辑器 在线 拖拽 可视化 编辑器 Canvas WebGL Canva With Canva, anyone c ...