AQS源码解读(ReentrankLock的公平锁和非公平锁)
2024-10-08 05:03:35
- 构建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 } - Debug所有断点处
- 流程图,个人理解,有些地方理解的不太透彻望包涵
最新文章
- plist文件里边如果最外层是字典的话,读出来是无序的。
- c++ 虚函数和纯虚函数
- 18.实现如下类之间的继承关系,并编写Music类来测试这些类。
- Logger
- git diff获取差异文件中文乱码的解决办法
- Android多国语言文件夹命名方式
- mysql windows 下导入大文件
- R语言数据合并使用merge数据追加使用rbind和cbind
- python各种类型的转换
- 【转】怎么解决java.lang.NoClassDefFoundError错误 ,以及类的加载机制
- 第六章 对象-javaScript权威指南第六版
- [转帖]HTTP 头部解释
- Java基础学习-Path环境变量的配置
- 面试:C++观察者模式实现
- GO语言的进阶之路-面向过程式编程
- Python内置模块:random,os,sys,和加密模块hashlib
- 18.4 运行脚本 sudo ./launcher.sh 必须先给他权限 才能使用
- Linux进程间的通信
- 《ASP.NET Web API 2框架揭秘》
- android--------Retrofit+RxJava的使用
热门文章
- HDU6321 Dynamic Graph Matching【状压DP 子集枚举】
- Codeforces Round #652 (Div. 2) C. RationalLee(贪心)
- AtCoder Beginner Contest 170
- Luogu T9376 区间GCD
- python爬取网易翻译 和MD5加密
- 一文弄懂使用Jmeter来进行性能测试
- C# 静态类 单例模式 对比
- kafka消息队列、环境搭建与使用(.net framework)
- linux多线程模拟银行家算法
- 解决debian (Friendly ARM 嵌入式板)的sudo等一部分命令无法TAB补全