• synchronized


    synchronized锁

    image-20220729095353537

    无锁: 不锁住资源,多个线程中只有一个能修改资源成功,其他线程会重试

    偏向锁: 同一个线程执行同步资源时自动获取锁资源 (有4.x 的启动时间)

    轻量锁: 多个线程竞争同步资源时,没有获取资源的线程自旋等待锁释放

    重量锁: 多个线程竞争同步资源时,没有获取资源的线程阻塞等待唤醒

    Monitor: 一种同步工具,描述为一个对象。每一个java对象就有一把看不见的锁,称为内部锁或者Monitor锁。Monitor是线程私有的数据结构,每一个线程都有一个可用的monitor record 列表,同时还有一个全局可用的列表。每一个被锁住的对象都会一个monitor关联,同时monitor中有一个Owner字段存放拥有该锁的线程唯一标识,标识锁被这个线程占用。

    偏向锁

    一个线程一直访问同步代码块,线程自动获取锁。(线程A一直在拿锁,没有多线程竞争)

    在线程获取,和释放锁时,不在通过CAS操作。偏向锁住要时在无多线程竞争的情况下,不通过CAS操作锁,只是替换Mark Word 的ThreadID 时一次CAS原子指令

    偏向锁,在遇到其他线程尝试竞争偏向锁时,偏向锁的线程才会释放锁,线程不会主动释放偏向锁。偏向锁的撤销,需要等待全局安全点(没有字节码在执行),首先暂停拥有偏向锁的线程,判断锁对象是否处于锁定状态。撤销偏向锁后恢复到无锁、轻量锁、重量锁

    轻量级锁

    当锁时偏向锁的时候被另外的线程访问,偏向锁会升级为轻量锁,其他线程会通过自旋的形式尝试获取锁,不会阻塞,从而提高性能。

    虚拟机首先将在当前线程的栈帧中建立一个名为锁记录(Lock Record)的空间,用于存储锁对象目前的Mark Word的拷贝

    ,让后考吧对象头中的 Mark Word复制到锁记录中。拷贝之后虚拟机将使用CAS操作尝试对象的Mark Word 跟新为指向 Lock Record指针,并将Lock Record里的owner 指针指向对象的mark wored.

    如果操作成功,当前线程就获取锁。失败,虚拟机检查对象的 Mark Word 是否指向当前线程栈帧,如果是说明当前线程已经拥有了这个对象锁,否则说明多个线程在竞争。

    只有当前1个线程在等待通过自旋方式等待。自选超过一定次数,第三个线程来争取锁(A持有锁,B在自旋,C来尝试获取锁)轻量锁升级为重量锁。

    底部

  • 相关阅读:
    笔记本配USB拓展坞网卡经常时不时掉线
    Shell学习--Shell变量
    xxl-job不停刷日志导致磁盘很快就满
    反素数
    数学建模学习(85):人工蜂群优化算法(ABCO)求解多元函数
    SpringCloud 微服务注册中心 Eureka - Server
    基于web的医院预约挂号系统/医院管理系统
    stc15w404as使用keil做库,提供头文件,供调用
    用ANTLR实现表达式词法和语法分析器
    生产管理系统
  • 原文地址:https://blog.csdn.net/MXqihang/article/details/126118196