加锁和释放锁的原理
加锁和释放锁的原理
当方法执行完后或者抛出异常后,都会释放锁
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,则证明是重入进来的,继续持有锁,
可重入原理
可见性原理
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端