zoukankan      html  css  js  c++  java
  • Synchronized重入锁

    重入锁,指同一个线程试图获取一个已经由它自己持有的锁的一种“现象”。

    譬如有一个类:

    public class TestDemo{
        public synchronized void doSomething1(){
            doSomething2();
    }
    public synchronized void doSomething2(){...}
    }

    假设现在创建两个线程,ThreadA和ThreadB,同时调用TestDemo对象里面的方法,

    //定义线程A,ThreadA
    public
    class ThreadA extends Thread{ private TestDemo testDemo; public ThreadA(TestDemo testDemo){ this.testDemo = testDemo(); } public void run(){ testDemo.doSomething1(); testDemo.doSomething2(); } }
    //定义线程B,ThreadB
    public class ThreadB extends Thread{ private TestDemo testDemo; public ThreadA(TestDemo testDemo){ this.testDemo = testDemo(); } public void run(){ testDemo.doSomething2(); } }

            当ThreadA率先获得testDemo对象锁,进入doSomething1()方法,ThreadB想要执行doSomething2()方法时,就变成了阻塞等待状态,因为doSomething1()和doSomething2()方法都是用Synchronized声明,在不同线程调用同一对象的同步代码块的这一过程很容易理解。当ThreadA执行完doSomething1()方法时,ThreadA和ThreadB就会去争夺testDemo对象锁。

            对于ThreadA,它在调用doSomrthing1()同时,里面也调用了doSomething2()方法,在没有重入锁机制时,这种情况就会变成死锁,所以,对于同一个线程来说,是允许重入锁的,同时也意味着获取锁的粒度不是“调用”,而是“线程”。

            重入锁的实现机制是怎样呢?就是为每个锁关联一个获取技术值和一个所有者线程。当计数值=0时,这个锁就被认为没有任何线程持有。当一个线程请求一个未被持有的锁时,JVM将记下锁的持有者,并且将获取值置为1,如果同一个线程再次获取这个锁,计数值将递增1,而当线程退出同步代码块时,计数值递减1,当计数值=0时,这个锁将会被释放。(这个跟调用方法时,栈的内存分配机制理解上一致。)

  • 相关阅读:
    MIPI DSI协议介绍【转】
    [Android5.1][RK3288] LCD Mipi 调试方法及问题汇总【转】
    [kernel 启动流程] (第六章)第一阶段之——打开MMU【转】
    伙伴系统之伙伴系统概述--Linux内存管理(十五)【转】
    linux syscon and regmap study not【转】
    Linux Reserved Memory 预留内存【转】
    IOMMU & iomap &VFIO & uio【转】
    mipi和dsi【转】
    mipi LCD 的CLK时钟频率与显示分辨率及帧率的关系【转】
    LCD MIPI DSI时钟计算【转】
  • 原文地址:https://www.cnblogs.com/SysoCjs/p/10070586.html
Copyright © 2011-2022 走看看