synchronized
使用方式
1 同步实例方法,锁是当前实例对象
2 同步类方法,锁是当前类对象
3 同步代码块,锁是括号里面的对象
实现方式
synchronized是JVM内置锁,通过内部对象Monitor(监视器锁)实现,基于进入和退出Monitor对象实现方法与代码块同步,监视器锁的实现依赖底层操作系统的Mutex lock(互斥锁)实现
Monitor
每个对象都有自己的Monitor(监视器锁)
Monitor流程
JVM内置锁的膨胀升级
JDk>1.6中synchronized的实现进行了各种优化。例如适应性自旋,锁消除,锁粗化,轻量级锁和偏向锁
JDk>1.6默认开启偏向锁
开启偏向锁:-XX:+UseBiasedLocking -XX:BiasedLockingStartupDelay=0
关闭偏向锁: -XX:-UseBiasedLocking
锁的升级过程
锁只能升级不能降级,允许再次操作,重量级锁操作完成以后会释放锁,再次从偏向锁开始进行锁升级
JVM加锁原理
认识对象的内存结构
- 对象头:比如hash码,对象所属的年代,对象锁,锁状态标志,偏向锁(线程)ID。偏向时间,数组长度(数组对象)等
- 对象的实际数据:即创建对象时,对象中成员变量,方法等
对象的存储
对象的实例存储在堆空间,对象的元数据存在方法区(元空间区),对象的引用存在栈空间。