第二章:Java并发机制的底层实现原理

  • Java代码在编译之后会生成字节码文件,也就是.class文件。class文件经过类加载器的加载到JVM中,JVM解释字节码文件,最终转化为汇编指令在CPU上执行。Java中所使用的并发机制依赖于JVM的实现和CPU的指令

2:volatile

  • 保证了所有变量的内存可见性
  • 修改完之后,就会立即写入内存,并且告诉各个CPU中的缓存失效
  • 汇编指令:LOCK
    • 将当前的缓存行写入内存中
    • 锁总线,或者是锁缓存
    • 告诉其他的COU缓存的数据无效

3:synchronized

1:锁的对象

  • 普通的同步方法,锁的是该实例
  • static静态方法,锁的是class对象
  • 同步方法块,锁的是括号中的对象

2:原理

  • JVM基于进入和退出monitor对象来实现方法同步和代码块进行同步。代码块的同步时使用monitorenter和monitorexit指令进行实现的,但是方法的同步不是。
  • monitorenter指令是在编译后插入到同步代码块开始的位置,monitorexit是在方法结尾的地方,当有一个monitor被持有的时候,他就会处于锁定的状态。线程执行到monitor的时候,就会尝试获得对象所持有的锁。

3:Java对象头

  • mark word 对象头

    • hashcod GC年龄 锁(一位是偏向锁,两位锁的标志)
    • 偏向锁:线程ID + Epoch + GC年龄 + 1 + 01
      • Epoch表示重偏向了几次,记录偏向锁被撤销的次数,当次数达到阈值的时候,就不会分配偏向锁。
    • 轻量级锁:指向栈中锁记录的指针 + 00
    • 重量级锁:指向互斥量的指针 + 10
    • GC标记:空 + 11
  • 存储该对象类型数据的指针

4:锁的升级

  • 偏向锁

    • 对象头和锁记录中存放偏向的线程ID
  • 轻量级锁
    • JVM会在当前的线程栈中创建用于存储锁记录的空间,并将对象头中的mark word复制到锁记录中,即displaced mark word。
    • 然后线程进行CAS将对象头中的mark word替换为指向锁记录的指针,如果成功,当前的线程获得锁。
  • 重量级锁
    • 线程堵塞,响应时间缓慢

5:实现原子操作

  • 总线加锁

    • 处理器提供一个LOCK信号,当一个处理器在总线上输出此信号的时候,其他处理器的请求将会被阻塞,该处理器可以独占共享内存
  • 缓存锁

    • 写回的时候,不再发送LOCK信号,而是修改内部的内存地址,并通过缓存一致性的机制来保证操作的原子性。阻止两个以上的CPU同时修改自己的缓存信息

      • 数据不能被缓存在处理器内部的时候,或者是跨多个缓存行的时候,就不能使用缓存锁
      • 有一些处理器不支持缓存锁定

6:Java实现原子操作

  • CAS

    • CAMXCHG
    • 三大问题
      • ABA
      • 循环性能问题
      • 只能改变单个变量
  • 锁机制

并发编程的艺术:第二章相关推荐

  1. 并发编程基础篇——第二章(如何创建线程)

    上节讲了基础概念,本章正式进入线程专题,对基础薄弱的同学可以好好看本章!! 1.Thread匿名子类 我们可以通过下面的代码来直接创建一个线程. // 构造方法的参数是给线程指定名字,推荐 Threa ...

  2. 【编程实践】第二章 C++面向对象编程《C++程序设计语言》 / By 禅与计算机程序设计艺术ChatGPT

    [编程实践]第二章 C++面向对象编程<C++程序设计语言> / By 禅与计算机程序设计艺术&ChatGPT 第二章 C++面向对象编程 在C++中,面向对象编程主要通过类和对象 ...

  3. 《Java并发编程的艺术》笔记

    <Java并发编程的艺术>笔记 第1章 并发编程的挑战 1.1 上下文切换 CPU通过时间片分配算法来循环执行任务,任务从保存到再加载的过程就是一次上下文切换. 减少上下文切换的方法有4种 ...

  4. 《Java并发编程的艺术》——线程(笔记)

    文章目录 四.Java并发编程基础 4.1 线程简介 4.1.1 什么是线程 4.1.2 为什么要使用多线程 4.1.3 线程优先级 4.1.4 线程的状态 4.1.5 Daemon线程 4.2 启动 ...

  5. 并发编程的艺术 读书笔记

    第一章 并发编程的挑战 1. 单核CPU分配运行时间给各个线程,实现多线程执行代码. 举例:看英文书时某个单词不会,先记住看到书的页数和行数,然后去查单词,查完回到看书状态,相当于上下文切换. 2. ...

  6. 《JAVA并发编程的艺术》之Java内存模型

    <JAVA并发编程的艺术>之Java内存模型 文章目录 <JAVA并发编程的艺术>之Java内存模型 Java内存模型的基础 并发编程模型的两个关键问题 Java内存模型的抽象 ...

  7. Java并发编程的艺术_Conc

    Java并发编程的艺术 1 并发编程的挑战 1.1 上下文切换 即使是单核处理器也支持多线程执行代码,CPU通过给每个线程分配CPU时间片来实现这个机制.时间片是CPU分配给各个线程的时间,因为时间片 ...

  8. [书]java并发编程的艺术笔记

    本文属于自己整理的读书笔记,便于回顾.内容绝大部分来自书籍:java并发编程的艺术,版权归原作者所有. 第1章 并发编程的挑战 1.多线程一定比单线程快? 不一定,如同在同时阅读两本书时的来回切换切换 ...

  9. 多线程知识梳理(2) - 并发编程的艺术笔记

    layout: post title: <Java并发编程的艺术>笔记 categories: Java excerpt: The Art of Java Concurrency Prog ...

  10. Java并发编程的艺术(一)

    看<java并发编程的艺术>这本书,想着看的时候做个简单的总结,方便以后直接看重点. 一.并发编程的挑战 1.上下文切换 Cpu时间片通过给每个线程分配CPU时间片来实现多线程机制,时间片 ...

最新文章

  1. 无生命的AI算不上「智能」
  2. akka actor java_Akka:使用非默认构造函数在Scala中定义一个actor并从Java代码创建它 - java...
  3. [trustzone]-ARMV8的aarch64和aarch32环境下ELx级别的理解
  4. android Wifi开发相关内容
  5. Android如何给通知channel静音
  6. java 小题目_java一个小题目
  7. web字体设置成平方字体_如何托管自己的Web字体
  8. WebSocket 详解 1
  9. 现实给了梦想多少时间?
  10. 使用Java语言借助Quartz jar包实现定时器的方法
  11. 【气温预测】基于matlab BP神经网络气温预测【含Matlab源码 714期】
  12. Qt调用ffmpeg录制屏幕
  13. python如何输出整数_如何根据Python中的输入输出整数和浮点值?
  14. java 中文url转码_对 url 中含有的中文进行转码操作
  15. LaTeX参考文献取消doi输出
  16. python迭代器是什么百度百科_【python】迭代器与生成器究竟是什么?看完你就知道...
  17. CNAS认证和CMA认证是国内两种不同类型的权威认证
  18. 对极几何-三角测量-知识点
  19. CSS入门笔记5(浏览器渲染,CSS动画全解)
  20. 转载_BlueTooth: 蓝牙基带

热门文章

  1. 为最快动脉线诊断 铁科院联合第四范式完成高铁智能化巡检应用
  2. @AI大神们 前方31万巨额奖金,别走好吗跑起来!!!
  3. 【数据分析】数据分析基础:SQL重要知识点梳理!
  4. 【机器学习基础】常见二分类损失函数、距离度量的Python实现
  5. 【Python基础】快速提升效率的6个pandas使用小技巧
  6. 深度学习笔记 第四门课 卷积神经网络 第四周 特殊应用:人脸识别和神经风格转换...
  7. 谷歌Deep Bootstrap Framework:在线优化角度理解神经网络
  8. 如何做好 Android 端音视频测试?
  9. 互联网1分钟 |1022
  10. 架构设计从这5点考虑,能帮后期运维很大忙!