synchronized实现了哪种锁策略?
一、偏向锁阶段
概念:
- 核心思想是“懒汉模式”能不加就不加,能晚加就晚加锁。
- 当一个线程遇到了一个锁对象,他先标记,而不是直接加锁
- 一旦他标记的锁对象,被其他线程碰上,其他线程想要对这个锁对象加锁
- 你这个线程立马抢先其他线程一步对这个锁对象加锁,这时候就是真加锁了
- 如果没有其他线程和你争夺这个锁对象,那你这个线程也不加锁。
非必要,不加锁.
如此一来,就提升了代码的效率
一旦被迫加锁,就实现了 偏向锁阶段 → 轻量级锁阶段
二、轻量级锁阶段
其实就是 自旋锁来实现的
反复快速的对一个锁对象尝试加锁
优点就是能第一时间获得锁
缺点是会消耗大量的CPU资源
所以一但竞争锁的线程多了,锁冲突的概率大,导致自旋锁再疯狂的浪费cpu资源,但是又加不上锁
就进入第三个阶段 轻量级锁阶段→重量级锁阶段
三、重量级锁阶段
加锁失败,挂起等待.也就是进入阻塞状态
让出cpu资源
!!!注:锁的阶段一旦升级,是不可逆的。
上面对于synchronized 中锁策略的描述 提到了的自适应,其实就是根据实际情况升级锁的阶段
但是,不可逆。
以上内容输入锁sheng'ji
锁消除:
//synchronized会自动消除一些不必要的锁,比如这个锁里只要读操作,synchronized会认为发生线程安全的问题的概率不大,因此消除掉这个锁,提升了代码的效率.
锁粗化:
//细粒度
指的是锁内的代码相对少
//粗粒度
所内代码相对多
锁粗化之后:
为啥要锁粗化呢?
//因为你不断的加锁解锁而你锁内的代码又不是很多执行速度快,如此反复的加锁解锁必然会消耗大量的cpu资源和降低代码效率,锁粗化就可以解决这个问题