一 synchronized的概述
1.1 synchronized的特性
用锁能够实现数据的安全,但是会代理性能下降。Synchronized是一个重量级锁,锁的升级过程:无锁->偏向锁->轻量级锁->重量级锁。
1.2 synchronized锁性能低效原因
在java中早期版本中,synchronized属于重量级锁,效率低下,因为监视器monitor是依赖于底层操作系统的Mutex Lock(系统互斥量)来实现的。挂起和唤醒线程,需要做用户态和内核之间的切换,时间成本相对较高。java6后,为了减少获得锁和释放锁所带来的性能消耗,引入轻量级锁和偏向锁。
1.3 monitor作用
1.4 ObjectMonitor的作用
1.5 synchronized的升级流程
synchronized使用锁存储在java对象头部里的mark down字段里,锁升级主要依赖于markdown中的锁标志位和释放偏向锁标志位。
1.偏向锁:markdown存储的是偏向的线程id;
2.轻量锁:markdown存储的是指向线程栈中Lock Record的指针。
3.重量锁:markdown存储的是指向堆中的monitor对象的指针
二 无锁状态
2.1 介绍
1.结构: 前两行为8字节;后一行为类型指针4字节。
2.读取流程3.结论:无锁状态,一个对象被实例化后,如果还没有被任何线程竞争锁,那么它为无锁状态(001)
三 偏向锁
3.1