栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

浅谈ReentrantLock

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

浅谈ReentrantLock

文章目录
  • 一、ReentrantLock是用来做什么的?
  • 二、ReentrantLock的实现原理是什么?
  • 三、ReentrantLock对比于Synchronized有哪些优缺点?
  • 四、ReentrantLock的简单使用


一、ReentrantLock是用来做什么的?

这个类是JUC工具包中对线程安全问题提供的一种解决方案,它主要是用来给对象上锁,保证同一时间这能有一个线程在访问当前对象。这样处理是为了防止如果一个线程对某个公共变量进行了改变,而其它线程读取时读出来的是原有数据导致脏读的问题。

二、ReentrantLock的实现原理是什么?

ReentrantLock主要是通过同步队列和CAS机制来实现的,它实现的过程中主要包含下面几个属性:

  • status:锁状态,0表示没有线程获取锁,1表示已有线程获取锁
  • exclusiveOwnerThread:当前持有锁的线程
  • Node:节点,是ReentrantLock内部维持的一个双向链表(同步阻塞队列)的基本构成

具体流程

1、上锁更新锁状态:当A线程持有锁时,会通过CAS将status状态置为1,并将A线程自身存入exclusiveOwnerThread属性当中;
2、线程入队:而后线程B通过CAS获取锁时发现无法获取锁,此时就会获取node信息,但是由于node双向链表是null所以会通过CAS来创建一个双向链表的head对象,之后再把线程B封装成的Node节点通过尾插法接入双向链表的尾部;
3、线程阻塞:入队完成后再调用park方法进行阻塞;
4、释放锁并更新锁状态:当A线程释放锁时会将status属性重置为0,且把exclusiveOwnerThread置为null;
5、唤醒线程:A线程释放锁完毕后会调用unpark方法来唤醒双向链表中下一节点的线程B;

三、ReentrantLock对比于Synchronized有哪些优缺点?
  • 1、ReentrantLock的锁状态是可见的,而Synchronized的锁状态是不可见的;
  • 2、ReentrantLock是JDK层面的实现,而Synchronized是JVM层面的实现;
  • 3、ReentrantLock需要手动释放锁,而Synchronized不需要手动释放锁;
  • 4、ReentrantLock可以是非公平锁也可以是公平锁,而Synchronized只能是非公平锁;
  • 5、ReentrantLock是可被中断的,而Synchronized是不可悲中断的;
  • 6、Synchronized在特定条件下是后来的线程先获取锁,而ReentrantLock是先来的线程先获取锁;
四、ReentrantLock的简单使用
static ReentrantLock lock = new ReentrantLock();

for (int i = 0; i < 10; i++) {
    Thread thread = new Thread(() -> {
        lock.lock();
        try {
            for (int j = 0; j < 10000; j++) {
                sum++;
            }
        } finally {
            lock.unlock();
            latch.countDown();
        }
    });
    thread.start();
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/592449.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号