news 2026/4/23 16:28:36

<span class=“js_title_inner“>ReentrantLock基础用法示例</span>

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
<span class=“js_title_inner“>ReentrantLock基础用法示例</span>

ReentrantLock基础用法示例

作者:系统管理员

摘要

ReentrantLock基础用法示例


ReentrantLock 基础用法示例(完整可运行)

你需要的是 ReentrantLock 最核心的基础用法示例,我会提供可直接复制运行的代码,覆盖「基本加锁释放」「可重入特性」两个核心基础场景,并附带详细注释和运行结果说明。

一、核心基础用法(必掌握)

示例代码

import java.util.concurrent.locks.ReentrantLock; /** * ReentrantLock 基础用法示例: * 1. 基本的加锁(lock())和释放锁(unlock()) * 2. 可重入特性(同一线程多次获取同一把锁) * 3. 多线程安全保证 */ public class ReentrantLockBasicDemo { // 1. 创建 ReentrantLock 实例(默认非公平锁,性能更优) private final ReentrantLock lock = new ReentrantLock(); // 共享变量(用于验证线程安全) private int counter = 0; // 2. 核心方法:加锁执行线程安全逻辑 public void increment() { // 获取锁(阻塞式,当前线程会一直等,直到拿到锁) lock.lock(); try { // 线程安全的业务逻辑:对共享变量自增 counter++; System.out.println(Thread.currentThread().getName() + " 执行自增,counter = " + counter); // 演示可重入:同一线程调用另一个加锁方法 reentrantMethod(); } finally { // 必须在 finally 中释放锁! // 无论业务逻辑是否抛出异常,都能保证锁释放,避免死锁 lock.unlock(); } } // 3. 演示可重入的方法(同一把锁) private void reentrantMethod() { // 同一线程再次获取锁(可重入,不会死锁) lock.lock(); try { // getHoldCount():获取当前线程持有该锁的次数(重入计数) System.out.println(Thread.currentThread().getName() + " 重入锁成功,当前持有锁次数 = " + lock.getHoldCount()); } finally { // 重入的锁必须对应释放,否则计数不会归0,锁无法真正释放 lock.unlock(); } } // 测试入口 public static void main(String[] args) { ReentrantLockBasicDemo demo = new ReentrantLockBasicDemo(); // 4. 多线程测试:启动5个线程竞争锁 for (int i = 0; i < 5; i++) { new Thread(demo::increment, "线程-" + (i + 1)).start(); } } }

运行结果(示例)

线程-1 执行自增,counter = 1 线程-1 重入锁成功,当前持有锁次数 = 2 线程-2 执行自增,counter = 2 线程-2 重入锁成功,当前持有锁次数 = 2 线程-3 执行自增,counter = 3 线程-3 重入锁成功,当前持有锁次数 = 2 线程-4 执行自增,counter = 4 线程-4 重入锁成功,当前持有锁次数 = 2 线程-5 执行自增,counter = 5 线程-5 重入锁成功,当前持有锁次数 = 2

代码关键说明

  1. 锁的创建

    new ReentrantLock()默认创建非公平锁(性能优先,绝大多数场景推荐);若需公平锁,用new ReentrantLock(true)

  2. 加锁释放规范

  • lock.lock()

    :阻塞式获取锁,线程会一直等待直到拿到锁;

  • 释放锁必须放在finally块中,避免业务逻辑抛出异常导致锁泄漏;

  • 重入的锁要“获取多少次,释放多少次”(示例中increment()获取1次,reentrantMethod()再获取1次,对应释放2次)。

  • 可重入特性

    :同一线程多次调用lock()不会死锁,getHoldCount()可查看当前线程持有锁的次数(重入计数)。

  • 线程安全

    :多线程竞争下,counter自增完全有序,无线程安全问题。

  • 二、极简版基础示例(无重入,快速入门)

    如果只需要最基础的“加锁-释放”示例,可参考以下极简版本:

    import java.util.concurrent.locks.ReentrantLock; /** * ReentrantLock 极简基础示例(无重入) */ public class ReentrantLockMinimalDemo { private final ReentrantLock lock = new ReentrantLock(); private int num = 0; // 加锁执行简单逻辑 public void add() { lock.lock(); // 获取锁 try { num++; System.out.println(Thread.currentThread().getName() + ":num = " + num); } finally { lock.unlock(); // 释放锁 } } public static void main(String[] args) { ReentrantLockMinimalDemo demo = new ReentrantLockMinimalDemo(); // 启动3个线程测试 new Thread(demo::add, "T1").start(); new Thread(demo::add, "T2").start(); new Thread(demo::add, "T3").start(); } }

    运行结果(示例)

    T1:num = 1 T2:num = 2 T3:num = 3

    三、基础用法核心总结

    关键点回顾

    1. 核心规范

      :使用 ReentrantLock 必须遵循lock() → try → 业务逻辑 → finally → unlock(),这是避免死锁的核心。

    2. 可重入特性

      :同一线程可多次调用lock(),但需保证unlock()次数与lock()一致,否则锁不会真正释放。

    3. 默认特性

      :ReentrantLock 默认是非公平锁,性能优于公平锁,无需特殊场景(如排队)不要轻易用公平锁。

    4. 线程安全

      :基础用法的核心价值是保证多线程对共享资源操作的原子性,替代 synchronized 完成简单同步场景。


    原文链接: https://1024bat.cn/article/44

    来源: 淘书1024bat

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 16:17:57

**AI漫剧制作2025推荐,揭秘高效低成本内容创作新路径*

AI漫剧制作2025推荐&#xff0c;揭秘高效低成本内容创作新路径据《2025中国数字内容产业白皮书》显示&#xff0c;2025年国内AI视频内容市场规模预计突破850亿元&#xff0c;其中AI漫剧因其制作周期短、成本可控成为增长最快的细分赛道&#xff0c;年增长率高达210%。然而&…

作者头像 李华
网站建设 2026/4/23 16:18:10

AI scientist天塌了! 不到1小时,斯坦福教授用AI独立,自动完成1篇实证论文, 并且过程和结论都相当精准.

原创 计量圈社群 计量经济圈 2026年1月28日 00:01 中国香港 1.AI经济研究神器! 全网首发中国微观数据选题宝库, 秒生原创XY组合, 论文idea源源不断. 2.别再死磕模型了, 全网首发计量方法中国政策数据宝库. 秒出顶级Paper计量方法选择. 1-2年前说这个&#xff0c;可能还会被质疑…

作者头像 李华
网站建设 2026/4/23 14:10:11

无需专业设备!普通GPU运行Qwen3-Reranker-0.6B全攻略

无需专业设备&#xff01;普通GPU运行Qwen3-Reranker-0.6B全攻略 1. 为什么你需要这个“小而强”的重排序模型&#xff1f; 你有没有遇到过这样的场景&#xff1a; 在企业知识库里搜“客户退款流程”&#xff0c;结果排在第一的是三年前的会议纪要&#xff1b; 用RAG系统回答…

作者头像 李华
网站建设 2026/4/23 15:35:26

springboot货物物流管理系统-开题报告

目录 系统背景与意义系统目标技术选型创新点预期成果 项目技术支持可定制开发之功能亮点源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作 系统背景与意义 现代物流行业高速发展&#xff0c;传统人工管理方式效率低、易出错。基于SpringBoot…

作者头像 李华
网站建设 2026/4/23 15:55:51

MedGemma-X入门指南:Gradio界面功能详解与预设任务定制方法

MedGemma-X入门指南&#xff1a;Gradio界面功能详解与预设任务定制方法 1. 为什么你需要一个“会对话”的影像助手&#xff1f; 你有没有遇到过这样的情况&#xff1a;刚拿到一张胸部X光片&#xff0c;想快速确认是否存在肺纹理增粗或肋膈角变钝&#xff0c;却要等放射科医生…

作者头像 李华
网站建设 2026/4/23 12:41:10

YOLOE开放词汇表检测,中文场景表现如何?

YOLOE开放词汇表检测&#xff0c;中文场景表现如何&#xff1f; 你有没有遇到过这样的尴尬&#xff1a;训练好的YOLO模型在测试集上AP高达56.3&#xff0c;一上线就掉到32.1&#xff1f;不是数据漂移&#xff0c;也不是标注错误——而是客户突然说&#xff1a;“能不能识别这个…

作者头像 李华