基本概念
- synchronized早期的jdk版本是重量级的,需要调用os,因此非常耗时。
- jdk1.6版本开始通过jvm进行相应的优化,出现了synchronized的锁升级。
- synchronized锁本质不是锁代码,是锁对象,因此不要使用常量和基本数据类型上锁。
锁升级概念
本质上是为了减少每次向操作系统申请导致的时间较长问题。
流程(膨胀)
- 无锁(锁对象初始化时
- 开始上锁后,针对于锁对象会将先进入的线程记录下这个线程ID,Markword,属于偏向锁。
- 当再有线程来请求锁对象时,原本应该直接进入等待队列中,但是有可能存在占有锁的线程即将完成从而释放锁,因此如果该线程的执行代码比较短并且自旋的线程数量不多的情况下,将升级为自旋锁。
- 当自旋锁达到自旋次数(默认为10次)依然没有拿到锁后,将升级为重量级锁。
补充
- 操作系统的内存分为 用户内存和系统内存,系统可以访问所有,用户只能访问用户内存,因此有些操作需要向系统申请,例如创建线程等等。重量级锁也是如此,会从用户态变为内核态。