码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【直播笔记0629】 并发编程二:锁


    并发编程二:锁

    • 1. 对象有什么组成?
    • 2. 锁--悲观锁
    • 3. 乐观锁CAS
      • 3.1 ABA问题
      • 3.2 本身就要具备原子性
    • 4. synchronized底层实现
      • 4.1 轻量级和重量级
      • 4.1 synchronized内部的锁升级过程?
    • 5. 偏向锁
      • 5.1 什么是偏向锁?
      • 5.2 为什么睡眠5秒后,偏向锁就启动了
    • 类型指针
    • 方法论

    1. 对象有什么组成?

    锁:解决线程并发数据不一致的问题
    synchronized: 多个线程序列化执行
    信号量

    一个object占多少个字节:16个字节

    一个java对象包含四个部分

    前两个:对象头

    1. markWord 标记字 8bytes
    2. classpoint 类指针 4bytes
    3. instance data 实例数据 4~8
    4. padding 不能被8字节整除

    对齐存在的意义:方便整理

    在这里插入图片描述

    2. 锁–悲观锁

    synchronized关键字:就是给对象头markword上做了个标记

    markword三个作用:

    1. 记录锁
    2. 配合垃圾回收
    3. 存放hashcode

    在这里插入图片描述

    3. 乐观锁CAS

    解决数据不一致的另外一种解决方案:CAS 自旋锁
    compareAndSwap

    自带原子属性:不会被打断
    在这里插入图片描述
    自旋锁
    在这里插入图片描述
    往回写做一次比较,相同则写入,不同则读出继续做相同操作,直到一次成功。

    3.1 ABA问题

    其他线程修改数次最后值和原值相同。
    也可以是指向问题。
    如何解决:加一个版本号

    3.2 本身就要具备原子性

    如果判断没被修改后后,然后被别的线程修改了

    cas本身就要具备原子性

    1. cpu级别支持cas操作,底层支持。但是这个操作没有原子性,可能会被其他线程所打断。
    2. 如果是multy process多处理器,就加lock,就可以保障原子性,本质上还是悲观锁。
      在这里插入图片描述

    lock底层实现方式: 关中断,锁总线等

    在这里插入图片描述

    4. synchronized底层实现

    4.1 轻量级和重量级

    轻量级: CAS 转圈等
    重量级:排队等

    java起一个线程,os就会起一个线程 1比1线程。
    go是1对多。

    jvm解决不了的问题,扔给os操作系统去解决,这就叫重量级锁

    轻量级:jvm自己就解决了; whlie循环消耗cpu资源,
    重量级:交给os去解决,线程进入等待队列; 不需要消耗cpu资源

    为什么要有重量级?
    线程多少决定, 轻度竞争用轻量级,重度竞争用重量级。

    4.1 synchronized内部的锁升级过程?

    在这里插入图片描述

    轻量级什么时候升级为重量级锁?

    5. 偏向锁

    考的少了。

    睡了5秒后,再上锁
    在这里插入图片描述
    在这里插入图片描述

    5.1 什么是偏向锁?

    偏向锁就是一个标记

    将第一个线程id放在 锁的markword上。

    减少锁竞争,只有一个线程的时候(第一个线程),不启动锁机制,使用锁标记

    所有用到锁的地方百分之八九十的地方只有一个线程。

    有了其他线程,就进行了锁升级

    5.2 为什么睡眠5秒后,偏向锁就启动了

    如果明确知道环境一定是多线程的,没有必要启动偏向锁。

    jvm启动的时候,一堆的线程要启动,一开始没有必要启动偏向锁,默认4秒后启动。

    类型指针

    对象在内存中的存储布局
    32位,64位机器值得是指针长度,寻址空间

    2的32位, 4G, 内存最大只能4个G

    jvm64位虚拟机的 class pointer指针为4字节,默认启动压缩

    方法论

    项目驱动
    从脉络到细节

  • 相关阅读:
    【OCR】基于RCNN-CTC的不定长文本识别
    jni-02、lib路径、数组、对象、引用、extern修饰函数
    MultipartFile是什么
    vue3 快速入门系列 —— 状态管理 pinia
    java计算机毕业设计智能化管理的仓库管理源码+mysql数据库+系统+lw文档+部署
    大数据时代,怎样通过日志分析保护我们的数据!
    程序包lombok不存在,纠正网上错误答案
    uniapp——获取某元素距离顶部的距离,并将高度应用到css里面,为实现scroll-view内容而不让整个页面出现滚动条。
    184:vue+openlayers 设置时间显示白天黑夜交替图
    离线数仓同步数据2
  • 原文地址:https://blog.csdn.net/prague6695/article/details/125528905
  • 最新文章
  • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
    用 Hashids 优雅解决 C 端自增 ID 暴露问题
    V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
    LLVM Pass快速入门(四):代码插桩
    milkup:桌面端 markdown AI续写和即时渲染
    基于项目工程构建SBOM(软件物料清单)的研究
    鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
    .NET 中如何快速实现 List 集合去重?
    扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
    浅谈数据访问层
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号