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. 流程图,个人理解,有些地方理解的不太透彻望包涵

流程图地址

最新文章

  1. plist文件里边如果最外层是字典的话,读出来是无序的。
  2. c++ 虚函数和纯虚函数
  3. 18.实现如下类之间的继承关系,并编写Music类来测试这些类。
  4. Logger
  5. git diff获取差异文件中文乱码的解决办法
  6. Android多国语言文件夹命名方式
  7. mysql windows 下导入大文件
  8. R语言数据合并使用merge数据追加使用rbind和cbind
  9. python各种类型的转换
  10. 【转】怎么解决java.lang.NoClassDefFoundError错误 ,以及类的加载机制
  11. 第六章 对象-javaScript权威指南第六版
  12. [转帖]HTTP 头部解释
  13. Java基础学习-Path环境变量的配置
  14. 面试:C++观察者模式实现
  15. GO语言的进阶之路-面向过程式编程
  16. Python内置模块:random,os,sys,和加密模块hashlib
  17. 18.4 运行脚本 sudo ./launcher.sh 必须先给他权限 才能使用
  18. Linux进程间的通信
  19. 《ASP.NET Web API 2框架揭秘》
  20. android--------Retrofit+RxJava的使用

热门文章

  1. HDU6321 Dynamic Graph Matching【状压DP 子集枚举】
  2. Codeforces Round #652 (Div. 2) C. RationalLee(贪心)
  3. AtCoder Beginner Contest 170
  4. Luogu T9376 区间GCD
  5. python爬取网易翻译 和MD5加密
  6. 一文弄懂使用Jmeter来进行性能测试
  7. C# 静态类 单例模式 对比
  8. kafka消息队列、环境搭建与使用(.net framework)
  9. linux多线程模拟银行家算法
  10. 解决debian (Friendly ARM 嵌入式板)的sudo等一部分命令无法TAB补全