当前位置: 首页 > 编程日记 > 正文

聊聊高并发(十六)实现一个简单的可重入锁

可重入锁指的是假设一个线程已经获得了一个锁,那么它能够多次进入这个锁,当然前提是线程须要先获得这个锁。

可重入锁是最常使用的锁。Java的内置锁就是可重入锁,使用synchronizedkeyword能够启用内置锁机制,比方说一个类有两个synchronized方法A和B。在A方法中调用了B方法,假设锁不是可重入的。那么訪问B时须要再次竞争锁。这样会带来死锁。

        public synchronized void A(){B();}public synchronized void B(){}


可重入锁攻克了这个问题,它使用一个计数器来记录一个线程进入锁的次数,每次进入锁计数器就加1。释放锁减1。直到计数器为0时表示真正释放了锁。其它锁看到计数器不为0时就知道有其它线程已经获得了锁。就须要等待。Java的内置锁的基本原理也是这样,JDK1.5之后提供了显式锁ReentrantLock也是这个基本原理。


以下实现一个简单的可重入锁。

1. 使用一个Thread引用指向获得锁的线程

2. 使用一个计数器记录一个线程进入锁的次数,当计数器为0时表示锁是空暇的

3. 使用一个内部锁Lock来同步线程

4. 使用一个isHoldZero的条件来进行条件队列操作

5. 当获得锁的线程是自己时,仅仅改动计数器的值,直接获得锁

6. 当获得锁的线程不是自己时。须要在holdCount !=0 这个条件谓词上等待。直到计数器归0,再次竞争锁

7. 释放锁时计数器减1,当计数器为0时。唤醒在条件队列中等待的线程


package com.zc.lock;import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;/*** 简单的可重入锁实现,使用一个计数器记录当前线程重入锁的次数,获得锁时计数器加1,释放锁时计数器减1。当计数器等于0时表示释放了锁* **/
public class SimpleReentrantLock implements Lock{// 指向已经获得锁的线程private volatile Thread exclusiveOwnerThread;// 记录获取了同一个锁的次数private volatile int holdCount;private final java.util.concurrent.locks.Lock lock;// 是否是自己获得锁的条件private final Condition isCountZero;public SimpleReentrantLock(){lock = new ReentrantLock();isCountZero = lock.newCondition();holdCount = 0;}@Overridepublic void lock() {lock.lock();try{// 当前线程的引用Thread currentThread = Thread.currentThread();// 假设获得锁的线程是自己,那么计数器加1,直接返回if(exclusiveOwnerThread == currentThread){holdCount ++;return;}while(holdCount != 0){try {isCountZero.await();} catch (InterruptedException e) {throw new RuntimeException("Interrupted");}}// 将exclusiveOwnerThread设置为自己exclusiveOwnerThread = currentThread;holdCount ++;}finally{lock.unlock();}}@Overridepublic void unlock() {lock.lock();try{holdCount --;if(holdCount == 0){isCountZero.signalAll();}}finally{lock.unlock();}}}



转载于:https://www.cnblogs.com/gcczhongduan/p/5080648.html

相关文章:

2022-2028年中国蛋制品行业市场专项调查及前瞻分析报告

【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新(交付时间约3个工作日) 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国蛋制品行业市场行业相关概述、中国蛋制品行业市场行业运行环境、分析了中国蛋制品行业市场…

Twisted入门教程(3)

第三部分:开始认识Twisted可以从这里从头开始阅读这个系列。用twisted的方式实现前面的内容最终我们将使用twisted的方式来重新实现我们前面的异步模式客户端。不过,首先我们先稍微写点简单的twisted程序来认识一下twisted。最最简单的twisted程序就是下…

openstack高可用方案

openstack高可用方案 HA 将服务分为两类: • 有状态服务:后续对服务的请求依赖于之前对服务的请求。OpenStack中有状态的服务包括MySQL数据库和AMQP消息队列。对于有状态类服务的HA,如neutron-l3-agent、neutron-metadata-agent、nova-comput…

3D游戏设计和创作工具学习教程 3D Game Design Creation Tools

语言:英语中英文字幕(根据原英文字幕机译更准确) 大小解压后:1.94G 1280X720 mp4 三维游戏设计和创作工具 用扎实的工作流程开始开发游戏 课程获取:3D游戏设计和创作工具学习教程 3D Game Design & Creation Too…

Java学习总结:53(单对象保存父接口:Collection)

单对象保存父接口&#xff1a;Collection java.util.Collection是进行单对象保存的最大父接口&#xff0c;即每次利用Collection接口都只能保存一个对象信息。单对象保存父接口定义如下&#xff1a; public interface Collection<E> extends Iterable<E>由该定义…

ORA-00942:表或视图不存在(低级错误)

在好多时候。调试PL/SQL对象时会报。ORA-00942 看看错误原因吧&#xff1a; 报错原因&#xff1a;1.该schema没有对表或者视图没有select权限 2.就是该对象不存在 解决的方法&#xff1a; 1.授权给对应对象 2.create table or view 转载于:https://www.cnblogs.com/blfshiye/p/…

2022-2028年中国蛋白石行业发展现状分析及投资前景趋势报告

【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新&#xff08;交付时间约3个工作日&#xff09; 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国蛋白石行业市场行业相关概述、中国蛋白石行业市场行业运行环境、分析了中国蛋白石行业市场…

实验: VMware使用快照间接备份原始VMDK文件

资料上看的使用快照备份运行着的虚拟机 当虚拟机开着时&#xff0c;快照提供了一个备份原始 VMDK 文件的好办法。所有的写入操作在原始文件上暂停了&#xff0c;因此&#xff0c;复制它在另一个存储卷很安全。这就是像 VMware Consolidated Backup 和 Vizioncore 的 vRanger…

tomcat生成catalina.out文件

生成catalina.out方法 导语&#xff1a;本文为Windows下生tomcat将控制台信息输出到catalina.out文件 且 保证能实时查看日志文件的方法。 一、创建catalina.out 1、修改tomcat bin目录下的startup.bat文件 修改位置&#xff1a;在startup.bat文件倒数第二行 修改call "%…

Unity优化手机游戏学习教程

流派:电子学习| MP4 |视频:h264&#xff0c;1280720 |音频:AAC&#xff0c;48.0 KHz 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09;|大小解压后:3.69 GB |时长:6h 44m 创建移动游戏的优化技巧和技术 你会学到什么 如何优化手机游戏的图形和…

Java学习总结:54(集合输出)

集合输出 在Java中&#xff0c;集合的输出操作有四种形式&#xff1a;Iterator输出、ListIterator输出、foreach(加强型for循环)输出、Enumeration输出。 迭代输出&#xff1a;Iterator Iterator(迭代器)是集合输出操作中最常用的接口&#xff0c;而在Collection接口中也提供…

12.27评论5位同学试验三

23号李名贵&#xff0c;http://www.cnblogs.com/xieqiuyou/p/5017244.html#3323660 写的不错&#xff0c;每行语句都有注释&#xff0c;但截图不完整 24号施振成&#xff0c;http://www.cnblogs.com/nonecanstop/p/5079334.html 写的较完整&#xff0c;轮转法和优先算法都有用到…

2022-2028年中国袋式除尘用滤料行业市场全景评估及发展策略分析报告

【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新&#xff08;交付时间约3个工作日&#xff09; 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国袋式除尘用滤料行业市场行业相关概述、中国袋式除尘用滤料行业市场行业运行环境、分析了中…

TL-WDN3321 Ubuntu 下安装

为什么80%的码农都做不了架构师&#xff1f;>>> The WiFi USB dongles based on the newest RT5572 chip set do not work out of the box on Ubuntu. Unex DNUR-V72, D-Link DWA-160 Rev B and TP-Link TL-WDN3200 dongles are based on this chipset. You will …

解决真机编译出现System.DllNotFoundException: 'libmono-native.so'错误都方法

1、去掉勾选&#xff1a;使用共享运行时 2 检查android SDK是否安装了NDK 3、使用真机运行编译APK 转载于:https://www.cnblogs.com/CelonY/p/11355417.html

Revit: Twinmotion工作流程学习

Revit: Twinmotion Workflow MP4 |视频:h264&#xff0c;1280720 |音频:AAC&#xff0c;44.1 KHz&#xff0c;2 Ch 技能等级:中级|语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09; |时长:1h 22m |大小解压后:2.93 GB 含课程文件 Twinmotion是…

Java学习总结:55(偶对象保存:Map接口)

偶对象保存&#xff1a;Map接口 我们前面讲到的Collection属于单值保存父接口&#xff0c;每次只能保存一个对象&#xff1b;而我们这节讲的Map属于偶对象保存接口&#xff0c;利用Map可以保存一对关联数据(按照"key value"的形式)。 Map接口的常用方法 No方法名…

WPF的图片操作效果(一):RenderTransform

一.RenderTransform类的成员&#xff1a; 1.TranslateTransform 平移效果 2.RotateTransform 旋转效果 3.ScaleTransform 缩放效果 4.SkewTransform 扭转效果 5.TransformGroup 组合效果 6.MatrixTransform 是其他几个变形类的基类…

2022-2028年中国大气污染防治产业投资分析及前景预测报告

【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新&#xff08;交付时间约3个工作日&#xff09; 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国大气污染防治行业市场行业相关概述、中国大气污染防治行业市场行业运行环境、分析了中国大…

最近做手机端,GPS,微信QQ分享总结的问题

Android端 百度地图&#xff1a; 1.libs包中armeabi下liblocSDK4d.so文件丢失&#xff0c;导致百度定位失效。 微信分享&#xff1a; 1.分享App,app的内容&#xff08;图片加描述&#xff09;不能超过32kb &#xff0c;不然无法分享。&#xff08;直接跳至Oncancel事件中&#…

cap理论与分布式事务的解决方案

现在很火的微服务架构所设计的系统是分布式系统。分布式系统有一个著名的CAP理论&#xff0c;即一个分布式系统要同时满足一致性&#xff08;Consistency&#xff09;、可用性&#xff08;Availablility&#xff09;和分区容错&#xff08;Partition Tolerance&#xff09;三个…

Blender中的多平面动画学习教程

技能分享–Blender中的多平面动画 Skillshare – Multiplane Animation in Blender 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09; 大小解压后&#xff1a;1.34G 含课程素材 信息: 我们将在这堂课中致力于创建一个2D多平面相机效果&#xf…

BestCoder Round #68 (div.2) 1002 tree

题意&#xff1a;给你一个图&#xff0c;每条边权值0或1&#xff0c;问每个点周围最近的点有多少个&#xff1f; 思路&#xff1a;并查集找权值为0的点构成的连通块。 1 #include<stdio.h>2 #include<string.h>3 #include<stdlib.h>4 #include<math.h>…

Java学习总结:56(Stack子类)

Stack子类 Stack表示栈操作&#xff0c;栈也是一种动态对象数组&#xff0c;采用的是一种先进后出的数据结构形式&#xff0c;即在栈中最早保存的数据最后才会取出&#xff0c;而最后保存的数据可以最先取出。Stack类的定义如下&#xff1a; public class Stack<E>exte…

2022-2028年中国大理石料行业市场研究及前瞻分析报告

【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新&#xff08;交付时间约3个工作日&#xff09; 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国大理石料行业市场行业相关概述、中国大理石料行业市场行业运行环境、分析了中国大理石料行…

ActionScript 3操作XML 详解

AS3引入了E4X &#xff0c;它是根据ECMAScript标准处理XML 数据的全新机制。这使得程序员在程序中无缝地操作XML。在AS3中可以使用XML字面值将XML数据直接写入代码&#xff0c;该字面值将被自动解析。 一、AS3中的XML入门 1.可以将XML直接写入代码 public var employeelist:XML…

kubernetes关键特性和概述

kubernetes关键特性和概述 https://blog.csdn.net/u014042372/article/details/80573213 posted on 2019-08-16 11:23 竹径风声 阅读(...) 评论(...) 编辑 收藏 转载于:https://www.cnblogs.com/girl1314/p/11362768.html

Blender创作你自己的动画短片学习教程

Filmmaking with Blender – Create your own animated Short Film 时长:1h 20m |视频:. MP4 1280720&#xff0c;30 fps(r) |音频:AAC&#xff0c;44100 Hz&#xff0c;2ch |大小:1G 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09; 在本课…

Java学习总结:57(Properties子类)

Properties子类 Properties类本身是Hashtable的子类&#xff0c;但是由于Properties类都使用String数据类型进行操作&#xff0c;所以在使用Properties类时主要使用本类所定义的方法。Properties类常用方法如下&#xff1a; No.方法类型描述1public Object setProperty(Strin…

openwrt入门

一、安装Ubuntu(在vware安装) 注意使用图形系统 二、安装openwrt开发工具 1.打开命令窗CtrlAltT&#xff0c;切换到root用户&#xff1a;sudo -sH或sudo su&#xff0c;退出root用户&#xff1a;CtrlD或exit 2.切换到root&#xff0c;下载安装组件&#xff08;apt-get install …