首先一句话自己概述一下自己的理解,一种由JVM实现的互斥同步锁、非公平锁。
底层通过该 monitorenter 和 monitorexit 两个字节码指令实现。
在执行到monitorenter命令时,首先尝试获取对象锁,
成功,把锁的计数器加一,这时候对象就是锁定状态(非0),最后执行monitorexit,会将锁计数器减一来实现解锁。
注意:非零或者本身持有对象锁都可以获取对象锁,这个主要用来解决死锁问题,同时实现了锁重入
锁的本质是monitorenter和 monitorexit指令的一个 Reference 类型参数,即要锁定和解锁的对象。
jdk6之前,monitor完全依赖底层操作系统的互斥锁来实现(也因为此不同的底层实现有差别),
jdk6开始对锁做了许多优化,说之前先需要知道一个知识点,就是线程的挂起和唤醒需要操作系统协助,在用户态和内核态切换是很耗费资源的,我下面都用一句话来解释
首先就是自旋锁,就是发现对象被锁,死循环等一会再试一下。
锁消除:在运行时发现不可能存在共享数据竞争的锁进行消除。
锁粗化:在一系列连续动作都对同一对象反复枷锁和解锁,造成性能损耗,自动扩大锁范围
轻量级锁:相对原生互斥锁(悲观锁),他就是一种乐观锁,可以参考cas操作
倾向锁:提前预知倾向执行的线程,然后消除它的锁
比较:synchronized 和 Lock
1.synchronized 优点:实现简单,语义清晰,便于JVM堆栈跟踪,加锁解锁过程由JVM自动控制,提供了多种优化方案,使用更广泛 缺点:悲观的排他锁,不能进行高级功能 2.lock 优点:可定时的、可轮询的与可中断的锁获取操作,提供了读写锁、公平锁和非公平锁 缺点:需手动释放锁unlock,不适合JVM进行堆栈跟踪 3.相同点 都是可重入锁
来源:oschina
链接:https://my.oschina.net/u/817581/blog/3000252