偏向锁、 轻量级锁 、 重量级锁

锁的4种状态

      无锁状态

      偏向锁

      轻量级锁

      重量级锁

    一个对象刚开始实例化的时候,没有任何线程来访问它,处于无锁状态。

当第一个线程来访问它,它会偏向这个线程,此时,对象持有偏向锁。

这个线程在修改对象头成为偏向锁时使用CAS操作,并将对象头中的ThreadID改成自己的ID,

之后再次访问这个对象时,只需要对比ID,不需要再使用CAS在进行操作。

因为偏向锁不会主动释放,当第二个线程访问时引起竞争

检查原来持有该对象锁的线程是否依然存活,

如果挂了,则可以将对象变为无锁状态

如果原来的线程依然存活,且仍然需要持有偏向锁,则偏向锁升级为轻量级锁

如果不存在使用了,则可以将对象回复成无锁状态。

 

    轻量级锁认为竞争存在,但是竞争的程度很轻,一般两个线程对于同一个锁的操作都会错开,或者说稍微等待一下(自旋),另一个线程就会释放锁。

但是当自旋超过一定的次数,

或者一个线程在持有锁,一个在自旋,又有第三个来访时,轻量级锁膨胀为重量级锁,

重量级锁使除了拥有锁的线程以外的线程都阻塞,防止CPU空转。
阅读更多
个人分类: Java学习笔记
上一篇php基本语法
下一篇内存屏障、volatile、锁、final
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭