多线程知识体系

个人知识体系

多线程知识体系


多线程知识体系

深入分析synchronized原理和锁膨胀过程

Java线程池详解

深入理解线程和线程池

锁膨胀

锁膨胀方向:无锁 —> 偏向锁 —> 轻量级锁 —> 重量级锁

注:我们之前经常会听到锁升级是不允许降级的,这指的是 ”偏向锁 —> 轻量级锁 —> 重量级锁“ 这个过程,不包括 ”无锁 —> 偏向锁 “,当然你也可以这么理解,无锁状态本身就没有锁,所以何来锁升级一说呢?

  1. 从无锁到偏向锁

一个对象刚开始实例化的时候,没有任何线程来访问它的时候。它是可偏向的,意味着,它现在认为只可能有一个线程来访问它,所以当第一个线程来访问它的时候,它会偏向这个线程,此时,对象持有偏向锁,偏向第一个线程。这个线程在修改对象头成为偏向锁的时候使用 CAS 操作,并将对象头中的 ThreadID 改成自己的 ID,之后再次访问这个对象时,只需要对比 ID,不需要再使用 CAS.

  1. 从偏向锁到轻量级锁

一旦有第二个线程访问这个对象,因为偏向锁不会主动释放,所以第二个线程可以看到对象是偏向状态,这时表明在这个对象上已经存在竞争了,检查原来持有该对象锁的线程是否依然存活,如果挂了,则可以将对象变为无锁状态,然后重新偏向新的线程,如果原来的线程依然存活,则马上检查该对象的使用情况,如果仍然需要持有偏向锁,则偏向锁升级为轻量级锁( 偏向锁就是这个时候升级为轻量级锁的)。如果不存在使用了,则可以将对象回复成无锁状态,然后重新偏向。

  1. 从轻量级锁到重量级锁

轻量级锁认为竞争存在,但是竞争的程度很轻,一般两个线程对于同一个锁的操作都会错开,或者说稍微等待一下(自旋),另一个线程就会释放锁。 但是当自旋超过一定的次数,或者一个线程在持有锁,一个在自旋,又有第三个来访时,轻量级锁膨胀为重量级锁,重量级锁使除了拥有锁的线程以外的线程都阻塞,防止 CPU 空转。

你可能感兴趣的:(java)