zoukankan      html  css  js  c++  java
  • 013 synchronized的优化

    一 .概述

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

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

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

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


    二 .无锁状态

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


    三 偏向锁

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


    四 .轻量级锁

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

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

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


    五.重量级别锁

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


    六 . 总结

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

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

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

  • 相关阅读:
    关于C语言中类型的理解,有符号无符号的理解以及浮点数的理解
    关于集中注意力,情绪管理,记忆的总结整体
    关于链表逆置的问题
    git中reset和checkout的总结整理
    git中关于分支和stash的理解
    SVN和git的区别
    shell命令之find的用法
    (转载)获取服务器响应时间
    (转载)Spring定时任务的几种实现
    (转载)spring单例和多例详解。如何在单例中调用多例对象
  • 原文地址:https://www.cnblogs.com/trekxu/p/8996193.html
Copyright © 2011-2022 走看看