• sychronized设计原理


    synchronized底层对应的JMM模型8大原子操作lock与unlock

     synchronized原理分析

    加锁

    • 同步实例方法,锁是当前实例对象
    • 同步类方法,锁是当前类对象
    • 同步代码块,锁是括号里面的对象

    原理:

    synchronized标记的对象在编译为指令的时候,是被moniterenter和moniterexit所包装的,monitor对象是同步的基本实现单元。在jdk1.6之前,monitor的实现是通过操作系统内部的互斥锁,因为需要进行用户态到内核态的切换,所以同步操作是一个重量级的操作,性能很低。jdk1.6之后,提供了三种montor实现,也就是常说的三种不同的锁(偏向锁、轻量级锁、重量级锁)

     Monitor

    每个同步对象都有一个自己的Monitor(监视器锁)

    JVM加锁过程:

     锁的升级优化过程

    • JDK1.6版本之后对synchronized的实现进行了各种优化,如适应性自旋锁、轻量级锁和偏向锁,并默认开启偏向锁
    • 开启偏向锁: -XX:+UseBiasedLocking -XX:BiaseLockingStartupDelay=0
    • 关闭偏向锁:-XX:-UseBiasedLocking

    *使用重量级锁 才会去使用monitor

    synchronized 锁升级原理:

    在锁对象的对象头里面有一个 threadid 字段,在第一次访问的时候 threadid 为空,jvm 让其持有偏向锁,并将 threadid 设置为其线程 id,再次进入的时候会先判断 threadid 是否与其线程 id 一致,如果一致则可以直接使用此对象,如果不一致,则升级偏向锁为轻量级锁,通过自旋循环一定次数来获取锁,执行一定次数之后,如果还没有正常获取到要使用的对象,此时就会把锁从轻量级升级为重量级锁,此过程就构成了 synchronized 锁的升级。

    锁的升级的目的:

    锁升级是为了减低了锁带来的性能消耗。在 Java 6 之后优化 synchronized 的实现方式,使用了偏向锁升级为轻量级锁再升级到重量级锁的方式,从而减低了锁带来的性能消耗。

    当你发现自己的才华撑不起野心时,就请安静下来学习吧
  • 相关阅读:
    线程
    自定义异常
    throw 子句
    throw 语句
    异常处理
    异常处理
    匿名类
    接口的使用,内部类
    接口,接口的定义
    如何理解无偏估计?无偏估计有什么用?什么是无偏估计?
  • 原文地址:https://www.cnblogs.com/smallVampire/p/12599628.html
Copyright © 2020-2023  润新知