锁升级
原因:为了减少获得锁和释放锁带来的性能消耗,所以有了升级锁
流程:
无锁状态—偏向锁(jvm配置是否开启)----轻量级锁----重量级锁(不可逆,只要成为重量级,释放锁就一直是重量级)
常见锁
-
偏向锁:首先进入的线程,就被标记为偏向锁。如果有其他线程竞争。偏向锁就会升级为轻量级锁
-
轻量级锁:等待的进程不进入阻塞队列,自旋状态(消耗cpu,实现就是CAS),一直在查看是否有空位。当线程激烈(自旋线程多)就会升级为重量级锁
速度快,但消耗大 -
重量级锁:等待的进程进入阻塞队列,通知有空位,出阻塞队列争抢位置(需要维护阻塞队列)会引起上下文切换 速度在相对较慢 消耗减小
-
乐观锁(CAS):每次不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止。
cas操作需要输入两个值,一个旧值,一个是新值,操作期间先比较旧值有没有变化,没有变化更新新值,放生变化不交换 -
悲观锁 :synchronized是悲观锁,这种线程一旦得到锁,其他需要锁的线程就挂起的情况就是悲观锁。
-
对象锁 : 所有方法加锁 就是在对象上加锁 只有执行完一个才能执行别的 (面试点)不加锁的方法没影响(只要有一个方法没加锁 就不是对象锁) 对象锁只能影响同一对象的 new两对象就没影响
-
静态锁(类锁 在锁前加static): 只有前一个释放才能执行下一个 静态锁能影响静态锁 只有锁相同才能互相影响 必须锁方法 锁住变量不是整个类锁