Java内存模型

本文深入探讨Java并发编程的核心概念,包括线程、进程、JVM内存模型、硬件内存架构与Java内存模型的关系,以及并发编程的原子性、可见性和有序性特征。详细解释了JMM如何保证这些特性,以及各种并发控制机制如synchronized、volatile和JUC Lock的使用。
摘要由CSDN通过智能技术生成

1.基本概念:

  • 程序:代码,完成某一个件任务,代码序列(静态的概念)
  • 进程:程序在某些数据上的一次运行(动态的概念)
  • 线程:一个进程可能包含一个或多个线程(占用资源的独立单元) 线程介绍

如何开多进程 ?

如何开多线程?

2.JVM与线程:
JVM什么时候启动?类被调用 JVM线程–>其他的线程(main)
线程在JVM中

3.JVM内存模型

  • 方法区:类信息、常量、静态变量、运行时常量池、JIT(即时编译) (信息共享)
  • 堆:实例对象、GC (信息共享) (OOM)
  • 本地方法栈:native方法
  • 虚拟机栈:Java在运行时的模型,每一个方法都会有一个栈桢(局部变量、引用类型的数据地址、操作数栈) (OOM)
  • 程序计数器:java线程的私有数据,这个数据就是执行下一条指令的地址

4.Java内存模型 Java memory model JMM(规范,抽象的模型)
线程->工作空间->主内存(数据)

  • 主内存:共享的信息
  • 工作内存:私有信息,基本数据类型,直接分配到工作空间,引用的地址存放在工作空间,引用的对象存放在堆中
  • 工作方式:线程需要修改数据的时候先到工作空间去找,如果有直接在工作空间修改,如果工作空间没有就从内存复制进来,修改完成后再刷新到内存中

5.硬件内存架构与java内存模型
CPU中有寄存器
Cache有L1、L2、L3(从左到右 读写速度越来慢 容量越来大)
CPU(线程)->寄存器->Cache二级(工作空间)->内存

引入缓存之后会导致CPU缓存的一致性问题:并发处理的不同步,一个写一个读

解决方案:

  • 总线加锁(数据总线、控制总线、地址总线)让一个线程去使用 缺点: 降低CPU的吞吐量
  • 缓存上的一致性协议:(MESI)当CPU在Cache中操作数据时,如果该数据时共享变量,数据在Cache中读到寄存器中 ,将Cache Line置为无效,其他的CPU就从内存中读数据,进行新的修改,并更新内存数据

6.Java线程与硬件处理器的关系
多个任务->一个线程池->多个线程->多个内核线程->一个OS内核->多个CPU
在这里插入图片描述
7.Java内存模型与硬件内存架构的关系
工作空间的数据可以被寄存器、Cache、内存获取,内存也可以被寄存器、Cache、内存获取,所以在多线程中会出现数据不一致,所以需要Java内存模型来规范内存数据和工作空间的交互。
在这里插入图片描述

8.并发编程的三个特征

  • 原子性:不可分割
  • 可见性:线程只能操作自己工作空间中的数据,线程之间是独立的,t1不能访问t2的工作空间
  • 有序性:程序中的顺序不一定就是执行的顺序(JVM重排,编译重排序、指令重排序、提高效率,在不影响结果的前提下)
	int x = 1;
	int y = 2;
	int z;
	z = x + y;
	int m = 0;
	重排的时候会把 int m = 0 放到前面进行初始化,而按流水线的方式会比较慢因为需要执行完z = x+y 才能执行到m,和指令操作的时间有关系
	as-if-seria:在单线程中重排后不影响执行的结果,多线程
	happens-before

9.JMM对三个特征的保证

  • JMM 与 原子性
	X = 10 写 原子性  如果是私有数据具有原子性,如果是共享数据没有原子性
	Y = x 没有原子性 ,x是共享数据
		把x读到工作空间(原子性)
		把x的值写到Y (原子性)
	i++ 没有原子性 i = i + 1
		读 i 到工作空间
		+1
		赋值
	多个原子性的操作合并到一起没有原子性
		保证方式:
			Synchronized
			JUC Lock 的 lock
  • JMM 与 可见性
    Volatile:JMM的基础上实现了MESI协议,当t1工作空间要修改a的时候会copy a 到工作空间去 然后使用这个关键字就通知其他线程 让他们到内存中去读
    Synchronized:加锁 ,只有锁释放了其他线程才能去获取
    JUC Lock 的 lock
  • JMM 与 有序性
    Volatile 相当于有这个关键字的这个位置是不能重排的
    Synchronized :被锁的代码区间是不被重排的
    Happens-before原则:
    	程序次序原则
    	锁定原则:后一次加锁必须等前一次解锁
    	Volatile原则:加这个关键字的不被重排
    	传递原则:A->B->C   A->C
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值