zoukankan      html  css  js  c++  java
  • Java 可重入锁的概念

    看了个视频讲可重入锁,但是总是没讲清楚,自己写代码试了一下,贴上来记录好理解。

    可重入锁的概念

    视频中说线程A调用带锁的function1()时,如果function1()又调用了另一个带锁的function2(),那么就自动获取到了function2()的锁,但是这样理解很绕,我自己理解是:当一个线程获取到了一个锁lock时,相当于是占有了所有由这个lock所锁定的部分(即使这部分处于不同的方法或不同的synchronized块中。

    代码示例

    
    public class MyReenterLockStudy {
        public static void main(String[] args) throws InterruptedException {
            MyReenterLockStudy stu = new MyReenterLockStudy();
            new Thread(stu::function1,"线程 1").start();
            new Thread(stu::function2,"线程 2").start();
            Thread.sleep(2000);
        }
        private synchronized void function1()  {
            System.out.println(Thread.currentThread().getName()+"执行	 进入function1");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            function2();
        }
    
        private void function2() {
            System.out.println(Thread.currentThread().getName()+"执行	 进入function2");
            synchronized (this){
                System.out.println(Thread.currentThread().getName()+"执行	 function2同步体");
            }
        }
    }
    
    

    运行结果:


    示例解释

    运行可能会出现 3 种情况,我们分情况来分析。

    第一种

    线程1 首先开始运行,调用function1(),拿到锁,并输出 线程 1执行 进入function1,然后休眠1秒,此时也还持有着function2()的synchronized块内的锁;
    线程2 运行调用function2(),可以执行function2()中无锁的部分(线程 2执行 进入function2),然后由于锁被线程1占有,只能等待线程1执行完再执行synchronized的部分。

    第二种

    此种和方法一类似,只是线程2先运行了,但仍然是由线程1先抢到了锁(虽然线程1拿到的是function1()那里的锁,但这仍然阻止了线程2去执行function2()的后续部分)。

    第三种

    此种下,线程2先执行输出并抢到了位于function2()中synchronized块的锁,线程1就无法拿到function1()的锁,无法执行,只能等线程2结束。

  • 相关阅读:
    分工的好处
    这是真正的随笔,无论形式还是内容。。。
    javascript 检查函数传入的实参个数和期待的形参个数是否相同的方法
    JS中比较难记的函数
    3.0 Basic Usage of Class
    0.0 Visual Studio
    2.0 Exercise of Basic Statements
    5.0 String And RegularExpressions.
    1.0 HelloWorld
    dell mini9 fluxbox 声卡的安装 和 屏幕分辨率和刷新率的调节
  • 原文地址:https://www.cnblogs.com/pravez/p/13304253.html
Copyright © 2011-2022 走看看