并发之锁升级(偏向锁,轻量级锁,重量级锁)大白话

锁的分类

为了减少获得锁和释放锁带来的性能消耗,锁一共有4种状态,级别从低到高依次是:无锁状态、偏向锁状态、轻量级锁状态和重量级锁状态,这几个状态会随着竞争情况逐渐升级。锁可以升级但不能降级.

偏向锁——>轻量级锁

偏向锁是在对象头的markWord和栈帧中的所记录存放一个偏向线程id,如果线程a获得了锁,则这个对象的对象头就存放偏向线程id(a),如果一个线程来获取锁,会先检查当前偏向线程id是否指向这个线程,如果是则可以获取,如果不是则去验证当前对象头是否标记为偏向锁如果不是就cas竞争,如果是就使用cas将偏向锁id指向当前线程,标记不适合作为偏向锁,此时会触发偏向锁释放,锁升级为轻量级锁。

轻量级锁——>重量级锁

轻量级锁是将markword复制到栈中的所记录,将对象头的markword替换为指向锁记录的指针,线程a先获得锁,使得锁的对象头里面指向a线程的所记录,线程b再来获得锁就会触发cas循环,当a线程释放锁的时候使用cas将指针替换回markword发现b在竞争,就会触发升级,升级为重量级锁,阻塞线程b,线程a结束再通知b执行。

jvm
46 views
Comments
登录后评论
Sign In