高并发之JUC——关于Doug Lea公平锁与非公平锁设计思想与源码全面解析

本文详细分析了Java并发库JUC中的ReentrantLock,包括公平锁和非公平锁的工作原理。通过源码解读,阐述了公平锁在获取锁前会检查等待队列,确保先到先得,而非公平锁则更倾向于抢占。同时介绍了lock、unlock、signal和await等关键方法的实现细节,展示了如何在多线程环境下进行线程间的协作与同步。

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

在上两篇关于《高并发之JUC——AQS源码深度分析(一)》、《高并发之JUC——AQS源码深度分析,有你不得而知的条件等待队列(二)》文中介绍了Doug Lea设计的JUC高并发工具类AQS的设计思想及源码分析,同时也说明了AQS是整个JUC包其他工具类的基石。本文将介绍JUC工具包下面的首个实现类ReentrantLock,即公平锁和非公平锁。

应用示例

    public static void main(String[] args) throws Exception{
   

        // 重入锁,显示锁
        ReentrantLock reentrantLock = new ReentrantLock();
        // 条件队列。可调用signal方法来唤醒其他线程,相当于notify,可调用await方法阻塞当前线程,相当于wait。
        Condition condition = reentrantLock.newCondition();

        new Thread(()-> {
   
            // 加锁
            reentrantLock.lock();
            System.out.println(Thread.currentThread().getId());
            try {
   
                Thread.sleep(1000);
                // 唤醒其他线程,其他线程有机会获取到锁
                condition.signal();
                // 等待其他线程唤醒
                condition.await();
                System.out.println(Thread.currentThread().getId()+"执行完毕!");
                Thread.sleep(1000);
                condition.signal();
            } catch (InterruptedException e) {
   
                e.printStackTrace();
            }
            // 解锁,其他线程可获取到锁
            reentrantLock.unlock();
        }).start();


        new Thread(()-> {
   
            // 加锁
            reentrantLock.lock();
            System.out.println(Thread.currentThread().getId());
            try {
   
                Thread.sleep(1000);
                // 唤醒其他线程,其他线程有机会获取到锁
                condition
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值