码农知识堂 - 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字节,默认启动压缩

    方法论

    项目驱动
    从脉络到细节

  • 相关阅读:
    windows系统重装时,如何将对工作的影响降到最低,实现平滑过渡?
    动态规划的状态设计 | bot 讲课の补题
    Spring知识总结
    53-54 - 被遗弃的多重继承
    中国智能交通系统行业市场全景调研与发展前景预测报告
    深入探索Apache Camel与企业集成模式
    安防监控视频云存储平台EasyCVR页面播放卡顿的优化方法
    GDB用法(三)
    【LeetCode】881 救生艇 中等题
    rust专集0(开篇)
  • 原文地址:https://blog.csdn.net/prague6695/article/details/125528905
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号