千家信息网

Java中怎么实现不可重入锁和可重入锁

发表于:2025-12-01 作者:千家信息网编辑
千家信息网最后更新 2025年12月01日,Java中怎么实现不可重入锁和可重入锁,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。基础知识Java多线程的wait()
千家信息网最后更新 2025年12月01日Java中怎么实现不可重入锁和可重入锁

Java中怎么实现不可重入锁和可重入锁,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

基础知识

Java多线程的wait()方法和notify()方法

这两个方法是成对出现和使用的,要执行这两个方法,有一个前提就是,当前线程必须获其对象的monitor(俗称"锁"),否则会抛出IllegalMonitorStateException异常,所以这两个方法必须在同步块代码里面调用。

wait():阻塞当前线程

notify():唤起被wait()阻塞的线程

不可重入锁

所谓不可重入锁,即若当前线程执行某个方法已经获取了该锁,那么在方法中尝试再次获取锁时,就会获取不到被阻塞。我们尝试设计一个不可重入锁:

使用该锁:

当前线程执行print()方法首先获取lock,接下来执行doAdd()方法就无法执行doAdd()中的逻辑,必须先释放锁。这个例子很好的说明了不可重入锁。

可重入锁

接下来,我们设计一种可重入锁

所谓可重入,意味着线程可以进入它已经拥有的锁的同步代码块儿。

我们设计两个线程调用print()方法,第一个线程调用print()方法获取锁,进入lock()方法,由于初始lockedBy是null,所以不会进入while而挂起当前线程,而是是增量lockedCount并记录lockBy为第一个线程。接着第一个线程进入doAdd()方法,由于同一进程,所以不会进入while而挂起,接着增量lockedCount,当第二个线程尝试lock,由于isLocked=true,所以他不会获取该锁,直到第一个线程调用两次unlock()将lockCount递减为0,才将标记为isLocked设置为false。


看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注行业资讯频道,感谢您对的支持。

线程 方法 两个 尝试 设计 阻塞 接下来 代码 增量 知识 同步 帮助 清楚 例子 内容 再次 前提 块儿 基础 基础知识 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 上海企业软件开发零售价格 湖北系统软件开发排行 铁路特别重大网络安全事故的内容 数据库启用服务的命令是什么 网站服务器需要安装哪些默认功能 甘肃网络安全论坛 中国数据库会议 信息系统与网络技术考题 外国服务器需要icp证明吗 大学网络安全班会需要讲什么 南非能开一个网络技术公司吗 传奇世界服务器分布 福建京科通达网络技术 徐水区人民医院网络安全改造项目 学校存在的网络安全问题 asp连接mysql数据库方法 软件开发企业税负率 阿里服务器续费 怀远网络安全排名 聊城软件开发营业执照 数据库只查看视图的权限账号 如何做好网络安全检查 数据库查询例题及答案 java服务器有几种 视频聊天软件开发哪家产品好 学校存在的网络安全问题 企业软件开发阶段计划表 恒生互联网科技业指数成分 徐州助力智慧消防软件开发 治理网络安全的法律
0