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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java 文件上传到服务器_Java上传文件到服务器端的方法「建议收藏」

    java 文件上传到服务器_Java上传文件到服务器端的方法「建议收藏」Web文件上传采用POST的方式,与POST提交表单不同的是,上传文件需要设置FORM的enctype属性为multipart/form-data.由于上传的文件会比较大,因此需要设置该参数指定浏览器使用二进制上传。如果不设置,enctype属性默认为application/x-www-form-urlencoded,使用浏览器将使用ASCII向服务器发送数据,导致发送文件失败。上传文件要使用文件…

    2025年9月12日
    5
  • 静态方法中可以访问非静态成员变量_多线程局部变量会不会互相影响

    静态方法中可以访问非静态成员变量_多线程局部变量会不会互相影响静态内部类访问包含它的外部类的非静态成员变量时,可以通过new外部类().成员的方式访问,这是因为静态的只能访问静态的,因为他们在对象没创建前就存在了。如果想访问非静态的则必须初始化该对象,因为只有初始化后对象在内存才存在(静态的除外)…

    2022年8月31日
    7
  • 实现图片懒加载的三种方式(前端路由懒加载原理)

    1.什么是图片懒加载图片懒加载就是鼠标滑动到哪里,图片加载到哪里。总的来说,一般页面打开,会同时加载页面所有的图片,如果页面的图片请求太多会造成很卡很慢的现象,为了避免这一现象,利用懒加载图片的方法,提高性能(典型:淘宝)2.实现图片懒加载的原理图片懒加载的实现原理:将图片的地址放在data-set属性中,由于图片并没有在src中,并不会发送http请求。比…

    2022年4月16日
    87
  • 树莓派命令连接wifi_树莓派如何连接WIFI

    树莓派命令连接wifi_树莓派如何连接WIFIhello,大家好,我是叶秋!上一期呢,给大家介绍了如何给树莓派安装系统,有细心的朋友就会发现上一期安装系统的文章漏了一点点知识,不知道机智的你是否有发现呢~~(尴尬????)下次一定注意。。????在第五步使用putty连接树莓派的时候,是使用的ssh连接的,所以呢树莓派一定要开启ssh,树莓派开启ssh也很简单,就是写完系统以后,直接在根目录新建一个文件,改名ssh然后删掉后缀名就OK啦,记住一…

    2022年6月11日
    39
  • md5 java 实现_MD5加密的Java实现

    md5 java 实现_MD5加密的Java实现在各种应用系统中,如果需要设置账户,那么就会涉及到储存用户账户信息的问题,为了保证所储存账户信息的安全,通常会采用MD5加密的方式来,进行储存。首先,简单得介绍一下,什么是MD5加密。MD5的全称是Message-DigestAlgorithm5(信息-摘要算法),在90年代初由MITLaboratoryforComputerScience和RSADataSecurityInc的…

    2022年7月9日
    17
  • java Map遍历的5种方法和一些基本使用

    java Map遍历的5种方法和一些基本使用一:基本使用Map<String,Integer>map=newHashMap<>();map.put("a",1);map.put("b",2);booleanb=map.containsKey("3");//map中是否包含key为3的键值。System.out.pr.

    2022年9月21日
    2

发表回复

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

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