Java面试题:详细说明一下可重入锁ReentrantLock的原理

Java面试题:详细说明一下可重入锁ReentrantLock的原理原文地址:https://baijiahao.baidu.com/s?id=1594800969528243663&wfr=spider&for=pc一个关于打水的小故事话说从前有一个村子,在这个村子中有一口水井,家家户户都需要到这口井里打水喝。由于井水有限,大家只能依次打水。为了实现家家有水喝,户户有水用的目标,村长绞尽脑汁,最终想出了一个比较合理的方案。首先,在水井…

大家好,又见面了,我是你们的朋友全栈君。

原文地址https://baijiahao.baidu.com/s?id=1594800969528243663&wfr=spider&for=pc

一个关于打水的小故事

话说从前有一个村子,在这个村子中有一口水井,家家户户都需要到这口井里打水喝。由于井水有限,大家只能依次打水。为了实现家家有水喝,户户有水用的目标,村长绞尽脑汁,最终想出了一个比较合理的方案。

首先,在水井边上安排一个看井人,负责维持秩序。

然后,打水时,以家庭为单位,哪个家庭任何人先到井边,就可以先打水,而且如果一个家庭占到了打水权,其家人这时候过来打水不用排队。而那些没有抢占到打水权的人,一个一个挨着在井边排成一队,先到的排在前面。

最后,打水的人打完水以后就告诉看井人,看井人就让等待的队伍中的最前面一个去打水。

这样一来,大家都能打到水,也保证了相对的公平。这就是公平锁的基本思路。

随着时间的推移,村民发现每次去打水的时候都需要排队,想着每次排队都浪费时间,于是就把水桶放在井边代替,自己则溜回家去了。这样一搞,可把看井人累坏,经常往村民家里跑,让他们来打水。于是聪明的看井人想出了一个对策,如果有人打完水后,刚好又有其它人来打水,就直接让这个新来的人上去打水,不用到队伍末尾去排队等候。

这种方式虽然看上去不公平,但是他节省了资源,提高了打水的性能,这就是非公平锁的基本思路。

打水的小故事在java中的应用

Java中可重入锁-ReentrantLock基本上就是按照上面的思路来实现的,我们来对给他们做一个简单的对比。

一次只有一个人能打水 锁需要保证多线程的同步。

必须严格按照排队顺序打水 ReentrantLock提供的公平锁功能。

来得早不如来得巧 ReentrantLock提供的非公平锁功能。

有家人正在打水的时候就不需要排队 ReentrantLock的可重入特性。

那么可重入锁又是怎样实现上面那些特性的呢?

java可重入锁-ReentrantLock实现细节

首先我们从上面的故事入手,看看ReentrantLock中的各个角色都是怎么样的。

打水权 volatile int state

打水者 线程、Thread

打水队伍 双向链表Node

获取锁的时候,公平锁的整个工作流程就如下图所示:

Java面试题:详细说明一下可重入锁ReentrantLock的原理

可重入公平锁获取流程

在获取锁的时候,如果当前线程之前已经获取到了锁,就会把state加1,在释放锁的时候会先减1,这样就保证了同一个锁可以被同一个线程获取多次,而不会出现死锁的情况。这就是ReentrantLock的可重入性。

对于非公平锁而言,调用lock方法后,会先尝试抢占锁,在各种判断的时候会先忽略等待队列,如果锁可用,就会直接抢占使用。

释放锁的时候,整个工作流程如下图:

Java面试题:详细说明一下可重入锁ReentrantLock的原理

可重入锁释放过程

常见的面试题

说明一下ReentrantLock的原理。

ReentrantLock为什么是可重入的。

公平锁和非公平锁是什么?有什么区别。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/147255.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • thinkphp5进销存系统源码

    thinkphp5进销存系统源码thinkphp5开发的进销存管理系统,功能完善,界面也做的挺好的、、在这里插入图片描述

    2022年5月31日
    32
  • 开心农场最新外挂助手下载[通俗易懂]

    开心农场最新外挂助手下载[通俗易懂] “开心农场”辅助外挂使用说明:1.解压缩文件(本文件完全解压后只有876KB不占用多余空间)2.打开 这个图标www.vi128.com3.这时,在右下角会出现这个标志 然后双击它4.出现一个新的笔记5.在笔记主框内写上好友的名字(如果不好找也可以再加上编号)和将要成熟的作物6.写好后点击 右上角这个蓝色小闹钟的图标 7…

    2022年9月13日
    0
  • windows 2008文件服务器审计

    windows 2008文件服务器审计windows2008或者windows2008r2,系统做域内的文件服务器,能否做到谁删除某个共享出来的文件夹或者文件的操作审计?审计级别能做到怎么样一个程度?回答:依据您的问题您想知道Windows2008文件服务器的审计相关。依据我的经验,这个要分成两种情况:1.在远端访问,就是通过网络路径访问;2.在本地上本地访问共享文件,就是在创建的机器上访问;远端访问访问共享文件…

    2022年6月4日
    79
  • matlab怎么画二元函数_matlab求解二元方程

    matlab怎么画二元函数_matlab求解二元方程plot:画线(curve,二维空间以及三维空间)surf:画面(surface,一般在三维空间)1.surf绘图函数surf是surface的缩写,表示表面(显然至少三维图像才会有表面);z=3×2+3y2+3xy+1−3x−3y自变量区域的指定比如这样的一个定义域,D={(x,y)|x≥0,y≥0,x+y≤1}…

    2022年9月4日
    3
  • 高中物理学运动公式实现js动画

    高中物理学运动公式实现js动画js动画

    2022年10月15日
    0
  • xshell7怎么连接虚拟机_centos ssh

    xshell7怎么连接虚拟机_centos ssh文章目录一、xshell简介二、xshell安装三、xshell链接虚拟机的centos71.查看虚拟机中centos系统的ip2.利用ip链接一、xshell简介Xshell[1]是一个强大的安全终端模拟软件,它支持SSH1,SSH2,以及MicrosoftWindows平台的TELNET协议。Xshell通过互联网到远程主机的安全连接以及它创新性的设计和特色帮助用户在复…

    2022年9月16日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号