可重入锁的正确姿势

2024-05-27 14:38
文章标签 正确 姿势 重入

本文主要是介绍可重入锁的正确姿势,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

package Thread2;/*** 可重入锁示例*/
public class ReenTranLockDemo {private Object currentThread;private int lockTimes = 0;public synchronized void lock() throws InterruptedException {while (Thread.currentThread() == currentThread || currentThread == null || lockTimes > 0) {if (Thread.currentThread() == currentThread) {//当前线程重复加锁lockTimes++;System.out.println(1);System.out.println(currentThread);return;} else if (currentThread == null) {//当前线程首次加锁currentThread = Thread.currentThread();lockTimes++;System.out.println(2);System.out.println(currentThread);return;} else {//锁已被占用,当前线程进入等待wait();System.out.println(3);System.out.println(currentThread);}}System.out.println("lockTime:" + lockTimes);return;}public synchronized void unlock() {if (currentThread != null && Thread.currentThread() == currentThread) {if (1 == lockTimes) {currentThread = null;notify();System.out.println(4);System.out.println(currentThread);} else {System.out.println(5);System.out.println(currentThread);}lockTimes--;}System.out.println("lockTime:" + lockTimes);}}
package Thread2;public class RunReenTranLock3 {private static int a;private static int b;private static ReenTranLockDemo reenTranLockDemo = new ReenTranLockDemo();private static ReenTranLockDemo reenTranLockDemo1 = new ReenTranLockDemo();public static void main(String[] args) throws InterruptedException {Thread thread = getThread();Thread thread1 = getThread();Thread thread2 = getThread1();thread.start();thread1.start();thread2.start();thread.join();thread1.join();thread2.join();System.out.println("a:" + a);System.out.println("b:" + b);}public static Thread getThread() {Thread thread = new Thread(new Runnable() {@Overridepublic void run() {try {reenTranLockDemo.lock();for (int i = 0; i < 10000; i++) {a++;}method1();} catch (InterruptedException e) {e.printStackTrace();} finally {reenTranLockDemo.unlock();}}});return thread;}public static Thread getThread1() {Thread thread = new Thread(new Runnable() {@Overridepublic void run() {try {reenTranLockDemo1.lock();for (int i = 0; i < 10000; i++) {b++;}method2();} catch (InterruptedException e) {e.printStackTrace();} finally {reenTranLockDemo1.unlock();}}});return thread;}public static void method1() throws InterruptedException {reenTranLockDemo.lock();try {for (int i = 0; i < 10000; i++) {a++;}} finally {reenTranLockDemo.unlock();}}public static void method2() throws InterruptedException {reenTranLockDemo1.lock();try {for (int i = 0; i < 10000; i++) {b++;}method3();} finally {reenTranLockDemo1.unlock();}}public static void method3() throws InterruptedException {reenTranLockDemo1.lock();try {for (int i = 0; i < 10000; i++) {b++;}} finally {reenTranLockDemo1.unlock();}}
}

测试结果

2
Thread[Thread-0,5,main]
2
Thread[Thread-2,5,main]
1
Thread[Thread-0,5,main]
1
Thread[Thread-2,5,main]
5
Thread[Thread-0,5,main]
1
Thread[Thread-2,5,main]
5
Thread[Thread-2,5,main]
lockTime:2
5
lockTime:1
Thread[Thread-2,5,main]
4
null
lockTime:1
lockTime:0
4
null
3
null
2
lockTime:0
Thread[Thread-1,5,main]
1
Thread[Thread-1,5,main]
5
Thread[Thread-1,5,main]
lockTime:1
4
null
lockTime:0
a:40000
b:30000

这篇关于可重入锁的正确姿势的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1007764

相关文章

【测试】输入正确用户名和密码,点击登录没有响应的可能性原因

目录 一、前端问题 1. 界面交互问题 2. 输入数据校验问题 二、网络问题 1. 网络连接中断 2. 代理设置问题 三、后端问题 1. 服务器故障 2. 数据库问题 3. 权限问题: 四、其他问题 1. 缓存问题 2. 第三方服务问题 3. 配置问题 一、前端问题 1. 界面交互问题 登录按钮的点击事件未正确绑定,导致点击后无法触发登录操作。 页面可能存在

可重入锁和不可重入锁概念和区别

可重入锁就是一个类的A、B两个方法,A、B都有获得统一把锁,当A方法调用时,获得锁,在A方法的锁还没有被释放时,调用B方法时,B方法也获得该锁。 这种情景,可以是不同的线程分别调用这个两个方法。也可是同一个线程,A方法中调用B方法,这个线程调用A方法。 不可重入锁就是一个类的A、B两个方法,A、B都有获得统一把锁,当A方法调用时,获得锁,在A方法的锁还没有被释放时,调用B方法时,B方法也获得不

HDU1720(输入输出涨姿势)

A+B Coming Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 5953    Accepted Submission(s): 3901 题目链接: http://acm.hdu.edu.cn/showproblem.p

Circuit Design 三极管驱动蜂鸣器电路 及 蜂鸣器两端电压正确但是不响的解决方案

利用三极管进行电流放大的蜂鸣器驱动电路图: (百度图片找的) 我用有源蜂鸣器实现的这个电路,但是蜂鸣器不响。 details: 1. VCC =5V 蜂鸣器两端的直接电压约为4.5V, 但是蜂鸣器不响。 2. 将蜂鸣器直接接在4.5V的电源两端,蜂鸣器响。(说明蜂鸣器是好的) 3. 测了三极管各个管脚的电压, 和理论上的是一致的。 情况很奇怪,换了好几个三极管结果都是一样的,

ubuntu 20.04 一直卡在登录界面,即使密码正确也无法登录(失败记录)

ubuntu 20.04 一直卡在登录界面,即使密码正确也无法登录 这次是装实体机,一次失败的尝试。。。 名称型号CPUIntel Xeon E5-2673 V3GPURTX 3060 mobile 安装的时候不要选install third-party software for graphics and Wi-fi hardware and additional media

Web安全之GroovyShell讲解:错误与正确示范,安全问题与解决方案

1. 引言 Groovy 是一门基于 Java 虚拟机(JVM)的动态语言,而 GroovyShell 是 Groovy 提供的一个灵活强大的脚本执行工具。通过 GroovyShell,开发者可以在运行时动态执行 Groovy 脚本,它的灵活性非常适合那些需要动态编译与执行脚本的应用场景。然而,动态执行脚本同时也带来了一些潜在的安全风险,尤其在开发电商交易系统等敏感业务场景时,防止脚本注入与权限

Spark源码阅读的正确打开方式

Spark发展至今,应该说已经非常成熟了。是大数据计算领域不得不学习的框架。尤其是Spark在稳定性和社区发展的成熟度方面,吊打其他的大数据处理框架。 Spark至今只经历过1.x、2.x和3.x三个大版本的变化,在核心实现上,我们在Github能看到的最早的实现是0.5版本,这个版本只有1万多行代码,就把Spark的核心功能实现了。 当然我们不可能从这么古老的版本看,假如你接触过Spar

正确引入setupdesign和setupcompat的方式

正确引入setupdesign和setupcompat的方式 引入方式如下: ├── app│   ├── app.iml│   ├── assests│   ├── build│   ├── build.gradle // 配置1│   ├── libs│   ├── proguard-rules.pro│   └── src├── build.gradle├── TE

Mybatis - 在If标签中非空判断数字0时不正确的问题

一、问题     1、通常在对一个字段做非空判断时采取的方式如下,执行结果是符合预期的 <if test="name != null and name != ''">AND name = #{name}</if>     2、但是当这个字段的类型为数字且值为0时,会发现语句没有连接,判断失败 <if test="status != null and status != ''">AND s

前后端时间正确传递

引言:后端传递给前端去展示时间的时候将时间转化为String类型的时间数据去返回。此时就需要加上 @JsonFormat 注解来解决这个问题。 框架环境配置中,时间配置为 情形一: 数据库字段exam_time类型为date 后端实体类中examTime类型为Date 1.前端绑定的examTime类型type设置为datetime,以String类型进行传递 <e