加锁和释放锁的原理

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

加锁和释放锁的原理


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



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,则证明是重入进来的,继续持有锁,


可重入原理



可见性原理




刘牌
+关注
目录
打赏
0
0
0
0
29
分享
相关文章
synchronized 原理(锁升级、锁消除和锁粗化)
synchronized 原理(锁升级、锁消除和锁粗化)
12.synchronized的锁重入、锁消除、锁升级原理?无锁、偏向锁、轻量级锁、自旋、重量级锁
12.synchronized的锁重入、锁消除、锁升级原理?无锁、偏向锁、轻量级锁、自旋、重量级锁
117 1
12.synchronized的锁重入、锁消除、锁升级原理?无锁、偏向锁、轻量级锁、自旋、重量级锁
锁的阻塞,死锁,锁升级
阻塞 因为不同锁之间的兼容性关系,所以在有些时刻,一个事务中的锁需要等待另一个事务中的锁释放它所占用的资源。在InnoDB存储引擎的源代码中,用Mutex数据结构来实现锁。在访问资源前需要用mutex_enter函数进行申请,在资源访问或修改完毕后立即执行mutex_exit函数。
1157 0
深入并发锁,解析Synchronized锁升级
这篇文章分为六个部分,不同特性的锁分类,并发锁的不同设计,Synchronized中的锁升级,ReentrantLock和ReadWriteLock的应用,帮助你梳理 Java 并发锁及相关的操作。
1494 0
方法锁、对象锁、类锁的意义和区别
方法锁、对象锁、类锁的意义和区别
|
9月前
|
多线程(锁升级, 锁消除, 锁粗化)
多线程(锁升级, 锁消除, 锁粗化)
85 1
ReentranLock加锁的原理
ReentranLock加锁的原理 多线程 并发编程
464 0

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等