取经之路 - synchronized关键字

本文详细解析了Java中synchronized关键字的使用与底层实现原理,包括其在实例方法、静态方法及代码块中的应用,以及与可见性和锁机制的关系。探讨了synchronized的效率问题和优化策略,如偏向锁、轻量锁和重量锁的概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述

关键字synchronized

  • 使每个线程依次排队操作共享变量 <效率低,但是基础>

  • 原理

    • 场景
      • 方法
        • 实例方法 synchronized void func()
        • 静态方法 (类方法)static synchronized void func()
      • 代码块
        • 实例对象synchronized(this)
        • 类对象synchronized(ClassA.class)
        • 具体对象``string lock = “”; synchronized(lock)`

    **自我理解: **

    静态和实例的区别就是:

    • 静态属于这个类的所有实例的方法都会被锁
    • 实例仅仅锁住当前对象实例
  • 底层原理

  • 监听器

    • 先获取对象的监听器monitor才能继续执行
    • 同一时刻只用一个线程可以获得对象的监听器monitor <互斥>
    • 类对象的synchronized具有重入性,不需要再次获得锁
    • 每个对象都有监听器,只有获得监听器才能继续操作,否则线程等待阻塞
  • A happens-before B

    • A执行再B得前面
    • A得结果对B可见 <B读取到的数据使A的值>
  • 获取和释放锁的内存含义

  • 获取锁

    • 从主存中读取数据到工作内存
  • 释放锁

    • 将工作内存中的最新之刷新到主存

自我理解

对象的监听器和可见性

  • synchronized优化

悲观锁 很是悲观,一开始就认为自己有冲突,获取锁的时候阻塞其他线程获取锁

乐观锁爱笑的人运气不会差,一开始认位没有冲突,不会阻塞其他线程的操作

  • CAS 比较交换

    • 检测线程是否出现冲突

    • VON操作

      • V 内存存放的实际值

      • O 旧的值

      • N 更新的值

        操作

        V ==O -> V=N

        V!=O -> return V

    • 缺点

      • ABA问题 解决方案:AtomicStampedReference Java1.5之后引入
      • 自旋时间过长
      • 只能保证一个共享变量的原子操作 解决方案: 常量类
  • Java对象头

    • 组成
      • 锁状态
        • 无状态
        • 偏向锁
        • 轻量锁
        • 重量锁
      • 对象hashcode
      • 对象分代年龄
      • 是否偏向锁
      • 锁标记
    • 偏向锁
      • 使获得锁的代价减少 <通过检查对象头,避免CAS操作>
      • 等到竞争出现的时候才释放锁
    • 轻量锁
      • 执行代码前再栈帧创建锁记录空间
      • 可升级为重量锁 <锁可以升级不能降级>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值