并发编程专题

										**Java并发专题**

基本概念
程序:程序就是代码,主要完成某一个功能
进程:程序在某些数据上的一次运行
线程:一个进程包含了一个或者多个线程

JVM的内存区域
在这里插入图片描述
方法区
主要存放数据为(类信息,常量,static所修饰的,JUT即使编译信息),方法区的数据都是共享的
堆区:
主要存放数据为(实列对象)
VM stack(栈):
主要存放数据为(Java方法在运行的内存模型)
PC(程序计数器):
主要存放数据为(Java线程的私有数据,这个数据就是线程运行的下一条指令地址)
native method stack(本地方法栈):
主要存放数据为(一些底层方法,被native所修饰的方法)

Java的内存模型 Java memory model JMM(规范,抽象的模型)
在这里插入图片描述
主内存
存放共享数据
工作内存
存放线程私有数据,一些基本数据类型都放在工作空间中,引用地址存放在工作空间中(引用对象放在栈中)
工作方式
A线程修改私有数据,直接在工作空间中修改
B线程修改共享数据,先从内存中把共享数据读到工作空间中,然后在工作空间中修改数据,最后同步到内存中。

硬件内存架构与Java内存模型
在这里插入图片描述
问题:CUP缓存出现不一致问题,并发处理不同步
解决:
1总线加锁:跟synchronized差不多,只能一个CUP访问,这样降低了CUP的吞吐量
2MESI协议,在CPU操作一个共享数据时,先从内存中读取到缓存,然后读到寄存器里面进行修改,并更新内存中的数据,cache里面的数据置为无效,其他数据发现这个共享数据被置为无效就直接从内存读取。
Java线程与硬件处理器
在这里插入图片描述
解释上列图片:我们有多个任务丢给线程池,线程池就调用多个线程帮我们处理任务,多个线程又被多个内核线程所接受,统一交给内核处理,分配到多个CPU进行执行。
Java内存模型与硬件内存架构的关系
在这里插入图是片描述
交叉:数据的不一致
Java内存模型的必要性
Java内存模型的作用:规范内存数据和工作空间数据的交互
并发编程的三个特性:
原子性:一组操作不可分割,比如银行转账A账户转1000,B账户就必须收到1000
可见性:线程只能操作自己工作空间的数据
有序性:程序中的顺序不一定就是执行顺序
编译时,编译重排序
运行时,指令重排序
这样可以提高效率,两种原则
as-if-seria单线程中排序不影响执行结果
happens-before多线程
JMM对三个特性的保证
JMM与原子性:
A=1(有原子性)
B =A+1(没有原子性,先从内存中去读取到A到工作空间,在加1然后写入B)
A++(没有原子性,先读取A到工作空间,然后在修改A,然后再同步到内存中)
解决:
Synchronized与 JUC里面的Lock锁来保证原子性
JMM与可见性:
使用Volatile关键字,在JMM模型上实现了MESI协议。
被Volatile修饰的数据,都会被置为可见状态,其他线程发现是可见状态就直接到内存中 拿数据进行操作
Synchronized与Lock关键字也可以,因为他们封锁了数据,也相当于可见性
JMM与有序性:
Volatile所修饰的代码都不会被重排序
Synchronized被锁住的代码里也不能被重排序
遵守happens-before原则
代码次序原则(不管怎么排序最后的结果都不能被改变)
锁定原则(后一次加锁必须等上一个锁释放)
Volatile原则(被Volatile所修饰的代码都不能被重排序)
传递原则(A—B---C 不能A直接到C,A方法传递到B方法再传递到C方法,不能由A直接传递到C)
总结
JVM内存区域与JMM的关系
JMM与硬件的关系
JMM和并发编程的三个特征(有序性,as-if-seria,happens-force)

			JVM在时候时候启动?
			Java类被调用的时候启动,先启动JVM显示线程,再启动其他线程,列如main主线程
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值