zoukankan      html  css  js  c++  java
  • 加锁和释放锁的原理

    加锁和释放锁的原理

      当方法执行完后或者抛出异常后,都会释放锁

    method1等价于method2,因为method1执行完以后会自动释放锁,而么method2使用lock.unlock()释放锁

    反编译看monitor指令

    被 synchronized 关键字修饰的方法、代码块,就是 monitor 机制的临界区

    进入锁和释放锁是基于monitor来实现的 同步方法和同步代码块,monitor有两个指令,monitorenter会插入到同步代码块的位置,monitorexit会插入到方法块结束和退出的时候,可能有多个monitorexit对应一个monitorenter,因为退出可以是方法结束或者抛出异常

    通过反编译(把.class文件转为.java)

    编译:

    反编译:

    Monditorenter和Monditorexit

    实际上一个对象和一个monitor相关联,一个monitorde lock锁只能被一个线程再同一时间获得

    Monditorenter的三种情况

     1.当monitor计数器为0,代表没有被获得,然后线程立马获得该Monitor,并把计数器加1,当别的线程想进来,但是看到计数器为1,就代表已经被其他线程占有,就只有等待

    2.如果Monitor已经拿到了锁的所有权,又重入了锁,则monitor会累加

    3.如果monitor被其他线程占用了,当我想去获取的时候,不能获取到,只能处于阻塞状态,当计数器为0才能再次尝试去获取锁

    Monditorexit的作用是释放锁,前提是要先拥有此锁,原理是将计数器减1,减1如果monitor为0,则对象不再拥有对锁的所有权,就是解锁,如果不是1,则证明是重入进来的,继续持有锁,

    可重入原理

     可见性原理

     

    生命不止,折腾不息
  • 相关阅读:
    Ubuntu12.04安装svn1.8
    [NOIP模拟测试3] 建造游乐园 题解(欧拉图性质)
    图论模板
    [bzoj3073] Journeys 题解(线段树优化建图)
    [bzoj3033]太鼓达人 题解(搜索)
    [NOIP2016]天天爱跑步 题解(树上差分) (码长短跑的快)
    [HNOI2015]菜肴制作 题解(贪心+拓扑)
    [SDOI2015]排序 题解 (搜索)
    [CQOI2011]放棋子 题解(dp+组合数学)
    [ZJOI2011]看电影(组合数学/打表+高精)
  • 原文地址:https://www.cnblogs.com/steakliu/p/10657547.html
Copyright © 2011-2022 走看看