专栏首页JavaQ「每天一道面试题」ReentrantLock是如何实现公平锁及可重入的?

「每天一道面试题」ReentrantLock是如何实现公平锁及可重入的?

A、B两个线程同时执行lock()方法获取锁,假设A先执行获取到锁,此时state值加1,如果线程A在继续执行的过程中又执行了lock()方法(根据持有锁的线程是否是当前线程,判断是否可重入,可重入state值加1),线程A会直接获取锁,同时state值加1,state的值可以简单理解为线程A执行lock()方法的次数;当线程B执行lock()方法获取锁时,会将线程B封装成Node节点,并将其插入到同步等待队列的尾部,然后阻塞当前线程,等待被唤醒再次尝试获取锁;线程A每次执行unlock()方法都会将state值减1,直到state的值等于零则表示完全释放掉了线程A持有的锁,此时将从同步等待队列的头节点开始唤醒阻塞的线程,阻塞线程恢复执行,再次尝试获取锁。ReentrantLock公平锁的实现使用了AQS的同步等待队列和state。

具体ReentrantLock公平锁的实现原理请阅读【高并发编程-ReentrantLock公平锁深入解析

本文分享自微信公众号 - JavaQ(Java-Q),作者:wind瑞

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-11-11

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 我画了25张图展示线程池工作原理和实现原理,原创干货,建议先收藏再阅读

    有朋友留言提到文中的场景是IO密集型操作,不是CPU密集操作,不需要使用线程池,我猜这位朋友可能想表达的是IO密集且阻塞时间久的不要使用线程池方案解决。IO密集...

    JavaQ
  • Java中锁概念总结

    Java开发过程中会涉及很多锁,这些锁的作用各不相同,本篇对这些锁的概念及作用进行了整理。 公平锁和非公平锁 公平锁:多个线程申请获取同一个锁,按照线程的申请顺...

    JavaQ
  • Java多线程编程笔记之多线程技能

    1.进程和线程的概念及线程的优点 进程是程序在一个数据集合上运行的过程,是系统进行资源分配和调度的一个独立单位。 线程可以理解成是进程中独立运行的子任务。 线程...

    JavaQ
  • SpringBoot开发案例之多任务并行+线程池处理

    前几篇文章着重介绍了后端服务数据库和多线程并行处理优化,并示例了改造前后的伪代码逻辑。当然了,优化是无止境的,前人栽树后人乘凉。作为我们开发者来说,既然站在了巨...

    小柒2012
  • SpringBoot开发案例之多任务并行+线程池处理

    前几篇文章着重介绍了后端服务数据库和多线程并行处理优化,并示例了改造前后的伪代码逻辑。当然了,优化是无止境的,前人栽树后人乘凉。作为我们开发者来说,既然站在了巨...

    小柒2012
  • 【面试宝典】Java 如何进行线程同步?

    面试官:知道线程的同步吗? 小白:知道,线程的同步就是保证多个线程的共同资源在同一时刻只有一个线程在使用和修改,保证数据的唯一和准确。 面试官:那么如何保证数据...

    程序员互动联盟
  • 多线程开发,先学会线程池吧

    在实际开发场景中,我们经常要使用多线程开发应用,比如实现异步操作,或者为了提高程序的效率等等。但是以前我见过有实习生在使用的时候是直接new Runable()...

    java技术爱好者
  • 并发编程面试题汇总

    thinkwon.blog.csdn.net/article/details/104863992

    Java旅途
  • Thread方法

    这个方法返回线程的 ID 值,类型为 long。线程的 ID 在线程的整个生命周期中都不变。

    宇宙之一粟
  • 线程

    并发编程在开发一般的项目确实接触很少,也导致平时学习的机会也不多,基本上都是碰到相关问题时会查一些相关资料去解决,所以很少会对这本分知识有系统和全面的了解。虽说...

    胖虎

扫码关注云+社区

领取腾讯云代金券