• 013 synchronized的优化


    一 .概述

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

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

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

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


    二 .无锁状态

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


    三 偏向锁

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


    四 .轻量级锁

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

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

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


    五.重量级别锁

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


    六 . 总结

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

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

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

  • 相关阅读:
    python 全局变量与局部变量
    Python 百分号字符串拼接
    Python集合的基本操作
    sorted by value in dict python
    gVim vundle
    vim config
    vim move the cursor in a long sentence
    步步为营-37-自动生成数据库连接字符串
    步步为营-36-ADO.Net简介
    步步为营-35-SQL语言基础
  • 原文地址:https://www.cnblogs.com/trekxu/p/8996193.html
Copyright © 2020-2023  润新知