zoukankan      html  css  js  c++  java
  • synchronized实现原理

      synchronized实现同步的基础:java中每个对象都可以作为锁,如下:

    • 对于普通同步方法,锁是当前实例对象
    • 对于静态同步方法,锁是当前类的Class对象
    • 对于同步方法块,锁是synchronized括号里配置的对象

    当一个线程试图访问同步代码块时,它首先必须得到锁,退出或者抛出异常时必须释放锁。

    从JVM规范中看到,JVM基于进入和退出的Monitor对象来实现方法同步和代码块同步,使用了monitorenter和monitorexit指令实现的。

    Java对象头

    synchronized用的锁是存在Java对象头里面的。(剩下太细节,我也不想背,放弃),记住里面有个MARK word,里面存放一些hashcode。

    锁的状态

    锁一共有四种状态:无锁状态,偏向锁状态,轻量锁状态,重量锁状态

    这四种情况会随着竞争情况逐渐升级,锁可以升级,但不能降级(这种只能升级的锁策略是为了提高获得和释放锁的效率)

    优点 缺点 使用场景
    偏向锁

    加锁和解锁不需要额外的开销,

    执行非同步方法相比仅存在纳秒的差别

    如果线程间存在锁竞争,会带来额外的锁撤销的消耗 只有一个线程访问同步块场景
    轻量级锁 竞争的线程不会阻塞,提高了程序的响应速度 如果始终得不到锁竞争的线程,使用自旋会消耗CPU

    追求响应时间

    同步块执行速度快

    重量级锁 线程竞争不使用自旋,不消耗CPU 线程阻塞,响应时间缓慢

    追求吞吐量

    同步块执行时间较长

  • 相关阅读:
    dll-IL-metadata-反射
    Linux(Ubuntu)下安装Angular2
    在nodejs中使用input file批量上传文件的方法
    jq动态添加的元素触发绑定事件无效
    简单的在线计算器
    不同方法实现按钮背景图片的变换
    unity特殊文件夹
    《暗黑战神》随堂笔记
    《打砖块》教程知识梳理
    unity零散小知识
  • 原文地址:https://www.cnblogs.com/gudulijia/p/6771688.html
Copyright © 2011-2022 走看看