013 synchronized的优化
Posted 最爱五仁月饼
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了013 synchronized的优化相关的知识,希望对你有一定的参考价值。
一 .概述
在之前我们知道了synchronized关键词的运行机制,但是同时指出了synchronized的劣势,那就是粒度过大.
在jdk6之后,对synchronized进行了优化.
现在的synchronized对应锁按照竞争的程度进行了划分,完成锁的等级制度,但是锁的等级上升之后不能降级.
无锁 偏向锁 , 轻量级锁 , 重量级锁
二 .无锁状态
就是我们在没有进行同步操作的情况.
三 偏向锁
当第一个线程进行同步代码的时候,会乐观的认为仅仅只有一个线程会进入该代码块,这个时候只需要在对应的内置锁之中加上一个标记,标记是哪一个线程获取到了该锁就可以了.
四 .轻量级锁
当有一个线程获取到了偏向锁之后,如果这个时候有其它线程也需要该锁资源,那么偏向锁就需要升级为轻量级锁.
轻量级锁认为切换线程的状态代价太高,不如让第二个线程自己空跑CPU等待前面的线程任务,空跑CPU的资源消耗比切换线程状态的代价要小.
这种空跑CPU的状态我们称为自旋,因此轻量级锁有时也称为自旋锁.
五.重量级别锁
当争夺资源的线程数量更多,那么轻量级锁的就升级为重量级锁,这个之前的synchronized是一致的了.
六 . 总结
我们实际上根本无法控制锁的升级的,这是在JVM层次上完成的锁的转换的,我们只需要知道synchronized的效率未必很低,因此偏向锁和轻量级锁的效率依然很高.
使用synchronized的方式完成线程同步很简单,我们也喜欢使用这样的方式.
但是synchronized还有一个问题无法解决,就是怎么精细的控制,比如公平性等问题,后面的高级锁就是一种很好的替代方式.
以上是关于013 synchronized的优化的主要内容,如果未能解决你的问题,请参考以下文章
多线程:(synchronized方法synchronized块JUC)