- 课程名称:Java高并发编程,构建并发知识体系,提升面试成功率
- 章节名称:
- 第1章:课程准备
- 1-4:并发与高并发基本概念
- 1-5:Java内存模型
- 第1章:课程准备
- 讲师姓名:Jimin
- 时间:2022-11-11 23:34
课程内容
- 并发:同时拥有两个或者多个线程,如果程序在单核处理器上运行,多个线程讲交替地换入或者换出内存,这些线程是同时“存在”的,每个线程都处于执行过程中的某个状态,如果运行在多核处理器上,此时,程序中每个线程都将分配到一个处理器上,因此可以同时运行。目前我们的电脑或者线上的服务器都是多核的
- 多个线程操作相同的资源,保证线程安全,合理使用资源
- 高并发:高并发(High Concurrency) 是互联网分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计保证系统能够同时并发处理多个请求
- 服务能同时处理很多请求,提高程序性能
- Java内存模型(Java Memory Model, JMM)
- 是一种规范,它规定了Java虚拟机与计算机内存是如何协调工作的
- 它规定了一个线程如何以及何时可以看到其它线程修改过后的共享变量的值,以及在必须时如何同步访问共享变量
- Java堆heap与栈stack
- 对象存放在堆上,对象上的成员变量也会随着对象本身存放在堆上。线程1与线程2都可以访问这个对象,线程1与线程2都会保有独立的这个对象成员变量的私有拷贝
- Java内存模型中的CPU
- CPU寄存器,是CPU内存的基础,执行速度远大于在主存上执行的速度
- 为了主存速度接近同步,加入高速缓存CPU Cache Memory,作为内存与处理器之间的缓冲,因此计算的数据会被复制到缓存中,计算后,再同步到内存(主存)中。这样做的好处,处理器不等待缓慢的内存读写
- 线程的工作的内存可能是CPU的寄存器和高速缓存
- Java内存模型-同步操作
- Lock(锁定):作用于主内存变量,可以将一个变量标识为某一个线程的独占状态
- Unlock(解锁):将一个处于锁定状态的变量释放出来,释放出来的变量才可以被其它线程锁定
- Read(读取);也是作用于主内存变量,作用把一个变量的值从主内存中输送到工作内存中
- Load(载入):作用于工作内存变量,它把Read操作从主内存中得到的值,放入到工作内存的变量副本中
- Use(使用):把工作内存变量传递给执行引擎,每当虚拟机遇到一个需要使用变量的值的字节码指令时,就会执行这个操作
- Assign(赋值):作用于工作内存的变量,它把从执行引擎接收到的值赋值给工作内存变量,每当虚拟机接收到一个给变量赋值的字节码指令时,就会执行这个操作
- Store(存储):作用于工作内存变量,是把工作内存的值传递到主内存中,以便随后的Write操作能够使用
- Write(写入):作用于主内存变量,它把store操作从工作内存得到的值,放入到主内存变量中
- Java内存模型-同步操作规则
- Read、Load与Store、Write操作单一出现,这两对操作是一个连贯操作,而且是按照书写顺序执行,不能有颠倒,但两者之间,却是可以插入其它指令的
- 不允许一个线程丢弃掉它最近的Assign操作。这个意思就是变量在工作内存中改变了值,必须要把变化同步到主内存
- 不允许一个线程无原因的,没有改动任何Assign操作,就把数据从工作内存同步给主内存。意思就是必须有Assign操作才能工作内存的值同步到主内存
- 一个新的变量只能从主内存中诞生,不允许在工作内存中直接使用一个未被初始化的值进行Use操作
- 一个变量在同一时刻只允许一条线程对其执行Lock操作,但是Lock操作可以被同一条线程执行多次,多次执行Lock后,只有执行相同次数的Unlock,变量才会被解锁
- 如果一个变量执行了Lock操作,将会清空工作内存中此变量副本的值,在执行引擎使用这个变量之前,必须要重新执行Read、Load、Use操作
- 如果一个变量没有执行Lock操作,则不可以执行Unlock操作,也不可以对被其它线程的Lock变量执行Unlock操作
- 对一个变量执行Unlock操作前,必须把此变量同步回主内存
课程收获
以前听这些规则时,完全不明就里,完全没有感觉有任何意义,现在听起来,真觉得大有文章,设计感十足,不得不说设计这个规范的人,头脑也太发达啦
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦