首先一句话自己概述一下自己的理解,一种由JVM实现的互斥同步锁、非公平锁。
底层通过该 monitorenter 和 monitorexit 两个字节码指令实现。
在执行到monitorenter命令时,首先尝试获取对象锁,
成功,把锁的计数器加一,这时候对象就是锁定状态(非0),最后执行monitorexit,会将锁计数器减一来实现解锁。
注意:非零或者本身持有对象锁都可以获取对象锁,这个主要用来解决死锁问题,同时实现了锁重入
锁的本质是monitorenter和 monitorexit指令的一个 Reference 类型参数,即要锁定和解锁的对象。
jdk6之前,monitor完全依赖底层操作系统的互斥锁来实现(也因为此不同的底层实现有差别),
jdk6开始对锁做了许多优化,说之前先需要知道一个知识点,就是线程的挂起和唤醒需要操作系统协助,在用户态和内核态切换是很耗费资源的,我下面都用一句话来解释
首先就是自旋锁,就是发现对象被锁,死循环等一会再试一下。
锁消除:在运行时发现不可能存在共享数据竞争的锁进行消除。
锁粗化:在一系列连续动作都对同一对象反复枷锁和解锁,造成性能损耗,自动扩大锁范围
轻量级锁:相对原生互斥锁(悲观锁),他就是一种乐观锁,可以参考cas操作
倾向锁:提前预知倾向执行的线程,然后消除它的锁