2026/4/18 10:00:51
网站建设
项目流程
中山cp网站建设,wordpress页面权限设置方法,公司网站可以自己做,78建筑网站ReentrantLock基础用法示例作者#xff1a;系统管理员摘要ReentrantLock基础用法示例ReentrantLock 基础用法示例#xff08;完整可运行#xff09;你需要的是 ReentrantLock 最核心的基础用法示例#xff0c;我会提供可直接复制运行的代码#xff0c;覆盖「基本加锁释放」…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代码关键说明锁的创建new ReentrantLock()默认创建非公平锁性能优先绝大多数场景推荐若需公平锁用new ReentrantLock(true)。加锁释放规范•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(); } }运行结果示例T1num 1 T2num 2 T3num 3三、基础用法核心总结关键点回顾核心规范使用 ReentrantLock 必须遵循lock() → try → 业务逻辑 → finally → unlock()这是避免死锁的核心。可重入特性同一线程可多次调用lock()但需保证unlock()次数与lock()一致否则锁不会真正释放。默认特性ReentrantLock 默认是非公平锁性能优于公平锁无需特殊场景如排队不要轻易用公平锁。线程安全基础用法的核心价值是保证多线程对共享资源操作的原子性替代 synchronized 完成简单同步场景。原文链接 https://1024bat.cn/article/44来源 淘书1024bat