前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ReentrantLock源码详解

ReentrantLock源码详解

原创
作者头像
查拉图斯特拉说
发布2024-01-29 23:20:01
820
发布2024-01-29 23:20:01
举报
文章被收录于专栏:后端架构后端架构

介绍

ReentrantLock是Java中用于多线程同步的一种机制,它允许线程在获得锁之后多次进入同步块,并且提供了比synchronized关键字更多的灵活性。ReentrantLock的源码分析可以帮助我们更好地理解其内部实现和工作原理。

AQS

ReentrantLock是基于AbstractQueuedSynchronizer(AQS)实现的,AQS是Java中用于构建锁和同步器的框架。ReentrantLock内部通过AQS维护着一个等待队列,来管理获取锁的线程。当一个线程尝试获取锁时,如果锁已被其他线程占用,它将会被加入到等待队列中,并被阻塞;当持有锁的线程释放锁时,AQS会从等待队列中唤醒一个线程来获取锁。

CAS

ReentrantLock的lock()方法通过CAS(Compare And Swap)操作尝试获取锁,如果获取成功,则将锁的持有者设置为当前线程;如果获取失败,则通过AQS的机制将当前线程加入到等待队列中。而unlock()方法则会释放锁,并唤醒可能在等待队列中的线程。

在ReentrantLock中,还涉及到锁的重入性、公平性等问题,这些都是通过AQS框架来实现的。ReentrantLock内部使用了一个state变量来表示锁的状态,以及一个同步器Sync来实现具体的加锁和解锁操作。

代码语言:javascript
复制
import java.util.concurrent.locks.ReentrantLock;

public class ReentrantLockExample {
    private static final ReentrantLock lock = new ReentrantLock();

    public static void main(String[] args) {
        Thread t1 = new Thread(ReentrantLockExample::performTask);
        Thread t2 = new Thread(ReentrantLockExample::performTask);

        t1.start();
        t2.start();
    }

    public static void performTask() {
        lock.lock();
        try {
            System.out.println(Thread.currentThread().getName() + " acquired the lock");
            // 执行一些需要同步的任务
        } finally {
            lock.unlock();
            System.out.println(Thread.currentThread().getName() + " released the lock");
        }
    }
}

我们创建了一个ReentrantLock实例,并在performTask方法中使用lock()和unlock()方法来控制对临界区的访问。两个线程t1和t2分别调用performTask方法,由于ReentrantLock的特性,它们可以多次获得锁,然后释放锁。这个示例展示了ReentrantLock的基本用法,以及如何在多线程环境下确保线程安全。希望这个示例能够帮助您更好地理解ReentrantLock的源码实现。

总结

总的来说,ReentrantLock源码的详细分析涉及到并发编程、线程调度、CAS操作等多个方面。与 synchronized 不同,ReentrantLock 提供了更多高级的特性,如可中断的锁、公平锁等,使得在复杂的多线程场景下更容易实现线程安全和灵活的同步控制。在这里只是简单介绍一下重入锁的一些主要功能特性。

最后

点赞关注评论一键三连,每周分享技术干货、开源项目、实战经验、国外优质文章翻译等,您的关注将是我的更新动力

我正在参与2024腾讯技术创作特训营第五期有奖征文,快来和我瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 介绍
  • AQS
  • CAS
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档