多线程与高并发


视频地址

面试题

请描述synchrnoized和reentrantlock的底层实现及重入的底层原理-百度 阿里
请描述锁的四种状态和升级过程-百度 阿里
CAS的ABA问题如何解决-百度
请谈一下AQS,为什么AQS的底层是CAS+volatile-百度
请谈一下你对volatile的理解-美团 阿里
volatile的可见性和禁止指令重排序是如何实现的-美团
CAS是什么-美团
请描述一下对象的创建过程い美团 顺丰
对象在内存中的内存布局-美团 顺丰
DCL单例为什么要加volatile-美团
解释一下锁的四种状态-顺丰
Objecto=new Object()在内存中占了多少字节?-顺丰
请描述synchronized和ReentrantLock的异同
聊聊你对as-if-serial和 happens-before 语义的理解-京东
你了解ThreadLocal吗?你知道ThreadLocal中如何解决内存泄漏问题吗?-京东 阿里
请描述一下锁的分类以及JDK中的应用-阿里

基础知识

计算机组成

在这里插入图片描述
控制单元(CU)、寄存器、算术逻辑单元(ALU)、时钟、缓存cache、总线、输入输出控制器(IO)

内存到CPU 通过总线,
总线分三种类型:控制线 地址线 数据线
CPU速度对比
cpu 是硬盘的100万倍。
在这里插入图片描述

进程与线程

共享空间但不共享数据。
进程的静态概念:程序进入内存,就会分配对应资源:内存空间 ,进程进入内存,同时产生一个主线程
线程是动态的是可执行的计算单元。CPU执行的基本单位。

线程的切换 context switch

保存上下文,保存现场。 程序计数器,保存线程数据到cache。

线程的公式

在这里插入图片描述

CPU的并发控制

当多个CPU访问同一份数据时怎么保证数据的一致性。
(1)关中断
(2)缓存一致性协议
(3)系统屏障
(4)总线/缓存锁

缓存一致性协议
CPU的速度与内存的速度是100:1
ALU 计算单元 访问 寄存器 速度,与访问内存的速度

在这里插入图片描述

MESI cache缓存一致性协议

英特尔CPI 使用MESI
引入 缓存行的概念,一次去 64bety 到 cache中。
验证。

 long p1 , p2,p3,p4,p5,p6,p7;
  long x =  0L;
  long p9,p10,p11,p12,p13,p14 ,p15;

在这里插入图片描述
如果 x y 位于同一行 ,x y 在两边的L3中都有缓存, 修改需要通知另外一个CPU,使数据保持一致。
两个线程分别子啊不同的 CPU 中运行,减少了通知的时间。例子:LinkedBlockingDeque

缓存一致性协议(MESI)

CAS 的实现

CAS的全称是Compare-And-Swap,它是CPU并发原语,,,比较并交换

它的功能是判断内存某个位置的值是否为预期值,如果是则更改为新的值,这个过程是原子的

CAS底层原理

对象内存布局

了解java内存工具 JOL = java object layout
在这里插入图片描述
在这里插入图片描述

一般java是一个64位,8字节指针长度应该是64位,但是由于默认开启 UserCompressedclassPointers 将8字节 压缩为4字节。
UserCompressedOops “ordinary object pointer” 普通对象指针, 对象中有一个String 指向了另一个对象 , 对象指针指向了String指针,这个指针的长度默认也是被压缩为4字节。

在这里插入图片描述
object 类的内存占用情况:
markWord 8 byte
class pointer 4byte 用于判断对象是属于哪一个class的(object.class或 user.class)
实例数据 0 byte
padding 对齐 4byte (被8整除)

synchronized原理详解

synchronized原理详解

偏向锁、轻量级锁(无锁、自旋锁)、重量级锁
在这里插入图片描述

名称描述
偏向锁单线程下
轻量级锁(无锁、自旋锁)有人争用
重量级锁竞争激烈升级
synchronized实现过程
  1. Java代码synchronized:class文件层面 Monitor enter Monitor exit 。
  2. 在JVM 执行过程中进行锁升级
  3. 操作系统层面 lock comxchg

volatile

CPU指令重排

Volatile禁止指令重排
在这里插入图片描述
在这里插入图片描述

指令重排序演示
在这里插入图片描述
volatile 底层实现
在这里插入图片描述
在这里插入图片描述

强软弱虚 JAVA中的引用类型

threadLocal

史上最全ThreadLocal 详解

spring 的@transactional注解

@transactional
m(){
	m1();
	m2();
}
需要保证 m1与m2拿到的数据库链接是同一个。
使用threadLocal实现的,只要是当前线程,conniction拿到的是同一个。

threadLocal 源码 使用了弱引用。防止内存泄漏。

如果threadLocal 中对象不使用需要手动调用 remove方法,否则会内存泄漏。
在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天使彦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值