013 synchronized的优化

Posted 最爱五仁月饼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了013 synchronized的优化相关的知识,希望对你有一定的参考价值。

一 .概述

在之前我们知道了synchronized关键词的运行机制,但是同时指出了synchronized的劣势,那就是粒度过大.

  在jdk6之后,对synchronized进行了优化.

现在的synchronized对应锁按照竞争的程度进行了划分,完成锁的等级制度,但是锁的等级上升之后不能降级.

无锁 偏向锁 , 轻量级锁 ,  重量级锁


 

二 .无锁状态

  就是我们在没有进行同步操作的情况.


 

三 偏向锁

  当第一个线程进行同步代码的时候,会乐观的认为仅仅只有一个线程会进入该代码块,这个时候只需要在对应的内置锁之中加上一个标记,标记是哪一个线程获取到了该锁就可以了.


四 .轻量级锁

  当有一个线程获取到了偏向锁之后,如果这个时候有其它线程也需要该锁资源,那么偏向锁就需要升级为轻量级锁.

  轻量级锁认为切换线程的状态代价太高,不如让第二个线程自己空跑CPU等待前面的线程任务,空跑CPU的资源消耗比切换线程状态的代价要小.

  这种空跑CPU的状态我们称为自旋,因此轻量级锁有时也称为自旋锁.


五.重量级别锁

  当争夺资源的线程数量更多,那么轻量级锁的就升级为重量级锁,这个之前的synchronized是一致的了.


六 . 总结

  我们实际上根本无法控制锁的升级的,这是在JVM层次上完成的锁的转换的,我们只需要知道synchronized的效率未必很低,因此偏向锁和轻量级锁的效率依然很高.

  使用synchronized的方式完成线程同步很简单,我们也喜欢使用这样的方式.

  但是synchronized还有一个问题无法解决,就是怎么精细的控制,比如公平性等问题,后面的高级锁就是一种很好的替代方式.  

以上是关于013 synchronized的优化的主要内容,如果未能解决你的问题,请参考以下文章

synchronized原理

Java synchronized 关键字详解

多线程:(synchronized方法synchronized块JUC)

多线程:(synchronized方法synchronized块JUC)

123

2.2.2synchronized同步代码块的使用