java 之 Synchronized 锁深度解读(和朋友探讨后的总结和验证)

时光毁灭记忆、已成空白 提交于 2020-04-14 03:54:45

【今日推荐】:为什么一到面试就懵逼!>>>

首先一句话自己概述一下自己的理解,一种由JVM实现的互斥同步锁、非公平锁

底层通过该 monitorenter 和 monitorexit 两个字节码指令实现。

在执行到monitorenter命令时,首先尝试获取对象锁,

成功,把锁的计数器加一,这时候对象就是锁定状态(非0),最后执行monitorexit,会将锁计数器减一来实现解锁。

注意:非零或者本身持有对象锁都可以获取对象锁,这个主要用来解决死锁问题,同时实现了锁重入

锁的本质是monitorenter和 monitorexit指令的一个 Reference 类型参数,即要锁定和解锁的对象。

 

jdk6之前,monitor完全依赖底层操作系统的互斥锁来实现(也因为此不同的底层实现有差别),

jdk6开始对锁做了许多优化,说之前先需要知道一个知识点,就是线程的挂起和唤醒需要操作系统协助,在用户态和内核态切换是很耗费资源的,我下面都用一句话来解释

首先就是自旋锁,就是发现对象被锁,死循环等一会再试一下。

锁消除:在运行时发现不可能存在共享数据竞争的锁进行消除。

锁粗化:在一系列连续动作都对同一对象反复枷锁和解锁,造成性能损耗,自动扩大锁范围

轻量级锁:相对原生互斥锁(悲观锁),他就是一种乐观锁,可以参考cas操作

倾向锁:提前预知倾向执行的线程,然后消除它的锁

比较:synchronized 和 Lock

1.synchronized
优点:实现简单,语义清晰,便于JVM堆栈跟踪,加锁解锁过程由JVM自动控制,提供了多种优化方案,使用更广泛
缺点:悲观的排他锁,不能进行高级功能
2.lock
优点:可定时的、可轮询的与可中断的锁获取操作,提供了读写锁、公平锁和非公平锁  
缺点:需手动释放锁unlock,不适合JVM进行堆栈跟踪
3.相同点 
都是可重入锁

 

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!