码迷,mamicode.com
首页 > 其他好文 > 详细

013 synchronized的优化

时间:2018-05-05 21:48:27      阅读:203      评论:0      收藏:0      [点我收藏+]

标签:有一个   不能   因此   控制   解决   自己   线程的状态   任务   现在   

一 .概述

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

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

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

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


 

二 .无锁状态

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


 

三 偏向锁

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


四 .轻量级锁

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

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

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


五.重量级别锁

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


六 . 总结

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

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

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

013 synchronized的优化

标签:有一个   不能   因此   控制   解决   自己   线程的状态   任务   现在   

原文地址:https://www.cnblogs.com/trekxu/p/8996193.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!