并发原子性分析

并发原子性分析

JVM字节码解析
  • 例(a++)

  • 源码

在这里插入图片描述

  • 字节码反编译

    在这里插入图片描述

    • 需要先将a参数压入操作数栈顶
    • 然后将int类型的1压入操作数栈顶
    • 随后栈顶两个数相加 压入操作数栈顶
    • 最后再赋值给a
原子性剖析
  • 在这里插入图片描述

  • 所以多个线程操作同一个数据的时候 因为JVM中底层不是原子性操作 所以会出现数据不能达到想定的问题

  • 问题解决

      • 悲观锁

        • 数据库行锁/表锁 synchronized
      • 乐观锁

        • MySQL中的MVCC JUC原子操作类 Redis中的watch/exec
      • Atomic(原子操作类)

        在这里插入图片描述

        在这里插入图片描述

      • synchronized关键字

        • 用法

          在这里插入图片描述

        • 对象的内存布局

          在这里插入图片描述

          • _klassOop部分:指向模板 当前对象的模板是谁 指向方法区的class对象

          • markOop(warkword)布局

            在这里插入图片描述

        • 变化

          在这里插入图片描述

          • 偏向锁 (可以配置JVM参数取消偏向锁)

            在这里插入图片描述

          • 轻量级锁

            在这里插入图片描述

            在这里插入图片描述

            在这里插入图片描述

          • 轻量级锁膨胀

            在这里插入图片描述

          • 重量级锁

            在这里插入图片描述

            • ObjectMonitor 对象监视器

            在这里插入图片描述

            在这里插入图片描述

  • wait方法 Owner----> Wait Set

  • notify、notifyAll方法 Wait Set ----> Entry List

  • wait方法和sleep方法区别

    • sleep方法是让出CPU的执行权、依然占用对象锁
    • wait方法是释放当前对象锁的内容
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值