ReenTrantLock简单使用

博客主要围绕ReenTrantLock的简单使用展开,涉及并发锁相关内容,为读者介绍了ReenTrantLock在实际中的基础运用方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ReenTrantLock简单使用

/**
 * @ClassName:MReenTrantLock
 * @Description:TODO加入锁,保证一次执行,同时也防止并发影响数据有效性
 * @Author:ZY
 * @Date:2019/6/24 0024 22:34
 * @Version:1.0
 **/
public class MReenTrantLock extends Thread {
    private static Integer num = 100;
    //为true则是公平锁
    private static Lock lock = new ReentrantLock(false);
    public void run () {
        for (int i = 0; i < 100; i++) {
            lock.lock();
            try {
                if (num == 0) {
                    break;
                }
                num--;
                System.out.println(num);
            } finally {
                lock.unlock();
            }
        }

    }

    public static void main(String[] args) {
        MReenTrantLock mReenTrantLock = new MReenTrantLock();
        for (int i = 0; i < 1000; i++) {
            Thread thread = new Thread(mReenTrantLock);
            thread.start();
        }
    }
}
<think>好的,我现在需要帮助用户了解如何在Java中使用ReentrantLock实现线程同步。首先,我应该回顾用户提供的引用内容,看看里面有什么有用的信息。引用[1]和[2]提到了使用ReentrantLock的示例代码,而引用[3]和[4]比较了synchronized和ReentrantLock的区别,引用[5]展示了ReentrantLock的基本使用流程。 首先,用户的问题是关于ReentrantLock的用法,所以需要给出一个清晰的步骤说明,并附上代码示例。根据引用中的信息,ReentrantLock需要创建实例,然后使用lock()和unlock()方法包围临界区。同时,必须在finally块中释放,以避免死,这一点在引用[2]和[4]中都有提到。 接下来,我需要组织回答的结构。可能分为几个步骤:创建对象、加、释放,以及可能的重入特性。此外,可能需要提到tryLock()方法,如引用[4]所说,它可以避免死。同时,代码示例应该包括一个简单的例子,比如售票系统,这样用户容易理解。 还要注意引用中的代码示例是否有错误。例如,引用[2]中的MyThread类使用了静态的ticket和,这可能是一个正确的做法,因为多个线程需要共享这些变量。此外,应该在所有线程实例之间共享,所以静态变量是合适的。 然后,我需要确保代码示例的正确性。例如,的获取和释放必须成对出现,unlock()必须在finally块中执行,无论是否发生异常。此外,异常处理部分是否需要?比如在引用[2]中,InterruptedException是在try块中被捕获的,这可能影响的释放,但因为有finally块,所以没问题。 还需要比较synchronized和ReentrantLock的不同,如引用[3]和[4]提到的。但用户可能更关注ReentrantLock的具体用法,所以可能不需要深入比较,但可以简要提及优势,如可中断、超时尝试获取等。 最后,生成相关问题,可能涉及性能分析、优化方法、应用场景,或者与其他同步机制的比较。需要根据引用中的信息提出相关的问题,比如如何避免死,tryLock的使用,或者ReentrantLock的高级功能如公平等。 现在,把这些思路整理成一个结构化的回答,确保步骤清晰,代码正确,引用正确标注。例如,在讲解步骤时,引用相关的引用编号,如引用[2]中的代码结构,引用[4]提到的tryLock方法。</think>### 如何在Java中使用ReentrantLock实现线程同步 #### 1. 核心步骤说明 **ReentrantLock** 是 `java.util.concurrent.locks` 包中提供的显式机制,通过以下步骤实现线程同步: - **创建对象**:使用 `ReentrantLock()` 构造函数实例化[^2]。 - **加与释放**:在访问共享资源前调用 `lock()`,执行完毕后调用 `unlock()`,通常将释放操作放在 `finally` 块中确保执行[^5]。 - **可重入特性**:同一线程可重复获取,避免死[^4]。 #### 2. 代码示例(售票系统) ```java import java.util.concurrent.locks.ReentrantLock; public class TicketSystem { private static int ticket = 0; private static final ReentrantLock lock = new ReentrantLock(); public static void sellTicket() { while (true) { lock.lock(); // 加 try { if (ticket < 50) { Thread.sleep(100); ticket++; System.out.println(Thread.currentThread().getName() + " 卖出第" + ticket + "张票"); } else { break; } } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); // 确保释放 } } } public static void main(String[] args) { new Thread(TicketSystem::sellTicket, "窗口1").start(); new Thread(TicketSystem::sellTicket, "窗口2").start(); } } ``` #### 3. 关键机制解析 - **的公平性**:构造函数 `ReentrantLock(boolean fair)` 可指定是否为公平(默认非公平)[^3]。 - **尝试获取**:`tryLock()` 方法在指定时间内尝试获取,失败后不阻塞线程,避免死。 - **与synchronized对比**: - **灵活性**:ReentrantLock 支持更细粒度的控制(如条件变量)。 - **可中断性**:`lockInterruptibly()` 允许在等待时响应中断。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值