首页 > 其他分享 >可重入锁的含义及解决的问题

可重入锁的含义及解决的问题

时间:2024-01-27 15:27:06浏览次数:25  
标签:重入 method2 method1 LockTest 含义 Object 解决 public

可重入锁顾名思义可以重复利用的锁,但不是任何方法都能重复使用,而是最初占有锁的方法调用的方法,即是调用方法与被调方法可以同时占用同一把锁。
下面从三个角度来说明:
1.被调方法没有加锁

public class LockTest {
    private static final Object obj=new Object();
    public void method1(){
        synchronized (obj){
            System.out.println("method1执行了");
            method2();
            System.out.println("回到了method1");
        }
    }
    public void method2(){
        System.out.println("method2执行了");
    }

    public static void main(String[] args) {
        LockTest lockTest=new LockTest();
        lockTest.method1();
    }
}

这种情况只有method1占用了锁,在调用method2,method1等待method2执行完即可再次执行释放锁
执行结果:

method1执行了
method2执行了
回到了method1

2.被调方法需要同样的锁,该锁为可重入锁

public class LockTest {
    private static final Object obj=new Object();
    public void method1(){
        synchronized (obj){
            System.out.println("method1执行了");
            method2();
            System.out.println("回到了method1");
        }
    }
    public void method2(){
        synchronized (obj) {
            System.out.println("method2执行了");
        }
    }

    public static void main(String[] args) {
        LockTest lockTest=new LockTest();
        lockTest.method1();
    }
}

这种情况method1先占用了锁,之后调用method2,发现method2也需要相同的锁,因为method2是method1的调用方法和synchronized是可重入锁(Reentrantlock也是)这两个条件,method2也占用了这把锁,即是method1,method2占用了同一把锁。
执行结果:

method1执行了
method2执行了
回到了method1

3.被调方法需要同样的锁,该锁是不可重入锁
因为jdk自带的锁都是可重入锁,采用在method2的synchronized锁前添加wait的方式模拟不可重入锁

public class LockTest {
    private static final Object obj=new Object();
    public void method1() throws InterruptedException {
        synchronized (obj){
            System.out.println("method1执行了");
            method2();
            System.out.println("回到了method1");
        }
    }
    public void method2() throws InterruptedException {
        wait();
        synchronized (obj) {
            System.out.println("method2执行了");
        }
    }

    public static void main(String[] args) throws InterruptedException {
        LockTest lockTest=new LockTest();
        lockTest.method1();
    }
}

这种情况也是method1先占用了锁,之后调用method2,发现method2也需要相同的锁,但不同的是:此时的锁是不可重入锁(模拟的)。method2因为拿不到锁不能继续执行,需要method1释放锁,而method1也在等待method2执行完后进行下一步操作,这样就相互等待产生死锁。
执行结果:

method1执行了
Exception in thread "main" java.lang.IllegalMonitorStateException
	at java.base/java.lang.Object.wait(Native Method)
	at java.base/java.lang.Object.wait(Object.java:328)
	at com.heimaweb.day1.LockTest.method2(LockTest.java:18)
	at com.heimaweb.day1.LockTest.method1(LockTest.java:13)
	at com.heimaweb.day1.LockTest.main(LockTest.java:26)

method2并没有输出

总结:可重入锁是调用方法与被调方法可以同时调用的一种锁,它的作用是防止调用方法与被调方法方法相互等待产生死锁现象。(因为jdk中自带的锁基本上都是可重入锁,所以可以放心用)

标签:重入,method2,method1,LockTest,含义,Object,解决,public
From: https://www.cnblogs.com/swliujavajourney/p/17991463

相关文章

  • [word] Word表格跨页怎么调整?三个解决方法
    在Word中频繁会用到表格数据,但是在Word表格的使用过程中经常会遇到这样一个问题:表格跨页显示,这应该怎么调整呢?下面分享三种解决的方法,大家可以试试。1、设置表格与下段同页选中整个表格,之后点击开始-段落设置按钮,接着在换行和分页的界面中,勾选上与下段同页,点击确定,表格自动显示在一......
  • 完美解决 - 前端发版后浏览器缓存问题
    一、简介开发完发布新版本后,在有些电脑上总需要强刷才能获取到最新版本的内容,太恶心了。浏览器缓存(BrowserCaching)是为了节约网络的资源加速浏览,浏览器在用户磁盘上对最近请求过的文档进行存储,当访问者再次请求这个页面时,浏览器就可以从本地磁盘显示文档,这样就可以加速页面......
  • [word] word文件显示只读怎么解决
    word文件显示只读怎么解决?在提示此文件为只读时,打开的word文档上方也会显示【只读】字样。如果是之前有人要保护此文档避免被修改,可以把文档另存为其他文件名后再进行编辑和保存。如果想解除文档的只读,可先关闭文档,然后找到并打开文档所在的文件夹,在文档名称上点击鼠标右键。在弹出......
  • GET&POST请求和响应的中文乱码解决方案
    Serlvet程序的请求和响应乱码问题get请求与post请求数据乱码publicclassRequestAPIServletextendsHttpServlet{@OverrideprotectedvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{//获取请求......
  • 用Promise解决并发
    前提假设有两个或多个网络请求函数如果使用asyn/await,假设一个请求需要2s,那么总共需要4s如果使用并发,则两秒即可完成两个请求constgetA=>(){returnPromise((resolve,reject)=>{setTimeout(()=>{reject('reject')},2000)})......
  • 04.性能测试解决方案
    性能监控系统价值性能监控体系介绍性能监控价值性能监控是什么对应用的多样化性能指标进行持续性收集、存储、分析和可视化。性能监控价值提升性能分析能力可以快速发现性能瓶颈辅助针对性的解决问题提高实时反馈与响应能力性能监控应用场景时序......
  • markdown图床问题解决
    写博客不仅要以文字形式记录,更重要的是把自己曾经的截图记录下来,更方便下次使用。所以有必要搞一个稳定的图床生成图片链接。一开始我是用的Github,新建一个仓库上传图片,优点是方便,缺点是网络不用魔法图片经常加载不出来。后来看到网上一些博主推荐使用七牛云图片存储,为此我购买......
  • 【C++】前置声明导致的代码含义改变
    真的有这么离谱的事哈哈哈哈。//F.hstructF{};structS:F{};//User.h#include<iostream>structF;structS;structUser{voidf(F*){std::cout<<"F"<<std::endl;}voidf(void*){std::cout<<"void"<......
  • el-input el-tree组件 问题:blur先于click触发怎么解决
    页面构造 使用mousedowm触发比blur更早,因为是组件所以得使用native,prevent阻止默认事件然后this.$refs.parentInput.focus();让焦点保持,点击展开或关闭箭头时候让焦点存在,点击节点的时候让页面关闭要兼容筛选效果,做了一个临时tempNode用于存放之前选择的对象,这样当在未进......
  • OpenAI 宣布将通过更新解决 GPT-4 变懒问题丨 RTE 开发者日报 Vol.135
       开发者朋友们大家好: 这里是「RTE开发者日报」,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享RTE(RealTimeEngagement)领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「有看点的会议」,但内容仅代表......