并发编程的艺术:第二章
第二章: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同时修改自己的缓存信息
- 数据不能被缓存在处理器内部的时候,或者是跨多个缓存行的时候,就不能使用缓存锁
- 有一些处理器不支持缓存锁定
- 写回的时候,不再发送LOCK信号,而是修改内部的内存地址,并通过缓存一致性的机制来保证操作的原子性。阻止两个以上的CPU同时修改自己的缓存信息
6:Java实现原子操作
- CAS
- CAMXCHG
- 三大问题
- ABA
- 循环性能问题
- 只能改变单个变量
- 锁机制
并发编程的艺术:第二章相关推荐
- 并发编程基础篇——第二章(如何创建线程)
上节讲了基础概念,本章正式进入线程专题,对基础薄弱的同学可以好好看本章!! 1.Thread匿名子类 我们可以通过下面的代码来直接创建一个线程. // 构造方法的参数是给线程指定名字,推荐 Threa ...
- 【编程实践】第二章 C++面向对象编程《C++程序设计语言》 / By 禅与计算机程序设计艺术ChatGPT
[编程实践]第二章 C++面向对象编程<C++程序设计语言> / By 禅与计算机程序设计艺术&ChatGPT 第二章 C++面向对象编程 在C++中,面向对象编程主要通过类和对象 ...
- 《Java并发编程的艺术》笔记
<Java并发编程的艺术>笔记 第1章 并发编程的挑战 1.1 上下文切换 CPU通过时间片分配算法来循环执行任务,任务从保存到再加载的过程就是一次上下文切换. 减少上下文切换的方法有4种 ...
- 《Java并发编程的艺术》——线程(笔记)
文章目录 四.Java并发编程基础 4.1 线程简介 4.1.1 什么是线程 4.1.2 为什么要使用多线程 4.1.3 线程优先级 4.1.4 线程的状态 4.1.5 Daemon线程 4.2 启动 ...
- 并发编程的艺术 读书笔记
第一章 并发编程的挑战 1. 单核CPU分配运行时间给各个线程,实现多线程执行代码. 举例:看英文书时某个单词不会,先记住看到书的页数和行数,然后去查单词,查完回到看书状态,相当于上下文切换. 2. ...
- 《JAVA并发编程的艺术》之Java内存模型
<JAVA并发编程的艺术>之Java内存模型 文章目录 <JAVA并发编程的艺术>之Java内存模型 Java内存模型的基础 并发编程模型的两个关键问题 Java内存模型的抽象 ...
- Java并发编程的艺术_Conc
Java并发编程的艺术 1 并发编程的挑战 1.1 上下文切换 即使是单核处理器也支持多线程执行代码,CPU通过给每个线程分配CPU时间片来实现这个机制.时间片是CPU分配给各个线程的时间,因为时间片 ...
- [书]java并发编程的艺术笔记
本文属于自己整理的读书笔记,便于回顾.内容绝大部分来自书籍:java并发编程的艺术,版权归原作者所有. 第1章 并发编程的挑战 1.多线程一定比单线程快? 不一定,如同在同时阅读两本书时的来回切换切换 ...
- 多线程知识梳理(2) - 并发编程的艺术笔记
layout: post title: <Java并发编程的艺术>笔记 categories: Java excerpt: The Art of Java Concurrency Prog ...
- Java并发编程的艺术(一)
看<java并发编程的艺术>这本书,想着看的时候做个简单的总结,方便以后直接看重点. 一.并发编程的挑战 1.上下文切换 Cpu时间片通过给每个线程分配CPU时间片来实现多线程机制,时间片 ...
最新文章
- 无生命的AI算不上「智能」
- akka actor java_Akka:使用非默认构造函数在Scala中定义一个actor并从Java代码创建它 - java...
- [trustzone]-ARMV8的aarch64和aarch32环境下ELx级别的理解
- android Wifi开发相关内容
- Android如何给通知channel静音
- java 小题目_java一个小题目
- web字体设置成平方字体_如何托管自己的Web字体
- WebSocket 详解 1
- 现实给了梦想多少时间?
- 使用Java语言借助Quartz jar包实现定时器的方法
- 【气温预测】基于matlab BP神经网络气温预测【含Matlab源码 714期】
- Qt调用ffmpeg录制屏幕
- python如何输出整数_如何根据Python中的输入输出整数和浮点值?
- java 中文url转码_对 url 中含有的中文进行转码操作
- LaTeX参考文献取消doi输出
- python迭代器是什么百度百科_【python】迭代器与生成器究竟是什么?看完你就知道...
- CNAS认证和CMA认证是国内两种不同类型的权威认证
- 对极几何-三角测量-知识点
- CSS入门笔记5(浏览器渲染,CSS动画全解)
- 转载_BlueTooth: 蓝牙基带
热门文章
- 为最快动脉线诊断 铁科院联合第四范式完成高铁智能化巡检应用
- @AI大神们 前方31万巨额奖金,别走好吗跑起来!!!
- 【数据分析】数据分析基础:SQL重要知识点梳理!
- 【机器学习基础】常见二分类损失函数、距离度量的Python实现
- 【Python基础】快速提升效率的6个pandas使用小技巧
- 深度学习笔记 第四门课 卷积神经网络 第四周 特殊应用:人脸识别和神经风格转换...
- 谷歌Deep Bootstrap Framework:在线优化角度理解神经网络
- 如何做好 Android 端音视频测试?
- 互联网1分钟 |1022
- 架构设计从这5点考虑,能帮后期运维很大忙!