java 锁升级流程
Synchronized 的锁升级流程是这样:无锁 ----> 偏向锁 ----> 轻量级锁----> 锁自旋 ----> 重量级锁
偏向锁
偏向锁,简单的讲,就是在锁对象的对象头中有个ThreaddId字段, 这个字段如果是空的,第一次获取锁的时候,就将自身的ThreadId写入到锁的ThreadId字内,将锁头内的是否偏向锁的状态位置1.这样下次获取锁的时候,直接检查ThreadId是否和自身线程Id一致,如果一致,则认为当前线程已经获取了锁,因此不需再次获取锁,略过了轻量级锁和重量级锁的加锁阶段。提高了效率。(摘抄的哈哈)
轻量级锁
轻量级锁,偏向锁是单线程下的锁优化,这个就说多线程下的锁优化了,当有多个 线程竞争同一个临界资源,这个时候偏向锁就会被撤(这个步骤也是十分消耗资源的),然后升级为轻量级锁,这个也是一个基于CAS的乐观锁。
锁自旋
锁自旋,什么是锁自旋呢,很简单就是线程自己做一些无用功,避免线程被挂起阻塞 ,它自己在哪里做一些空任务,然后去竞争锁,避免被挂起阻塞(阻塞和唤醒是又是十分消耗性能的行为,这边涉及到用户态和核心态的操作系统问题,一般我们操作的都是用户态,但是线程的挂起阻塞是需要从用户态切换到核心态,同样,线程唤醒也一样,这个步骤会造成巨大的性能消耗,能避免尽量避免)。当然,锁自旋也是会消耗一定的CPU的
重量级锁
重量级锁,也就是再一次的锁升级。这个时候线程就是进行锁自旋也不到锁,因为锁自旋也是需要消耗一定资源的,所以它不可能一直自旋自旋失败了,那么就进行锁膨胀,升级为重量级锁。
码字不易,给个赞咯
下面是我得公众号二维码,扫一扫可能有惊喜哦哈哈
转载:https://blog.csdn.net/memory_cood/article/details/116293609