并发编程(二)JMM模型

简介: 并发编程(二)JMM模型

什么是线程

进程是系统分配资源的基本单位,线程是CPU调度的基本单位,每个进程至少有一个线程,线程寄生在进程当中,每个线程都有一个程序计数器(保存下个要执行的指令),一组寄存器(保存当前线程中的工作变量),堆栈(记录执行历史,每一帧中保存了一个已调用但未返回的方法)。

线程分两类:

  • 用户级线程(user level thread)
  • 内核级线程(kernel level thread)

用户空间划分:

  • 用户空间
  • 内核空间

ULTKLT

ULT与KLT.png

Java线程与内核线程的关系

Java线程与内核线程的关系.png

Java线程生命状态

Java线程的生命状态.png

线程上下文切换过程

线程上下文切换过程.png

JMM模型

JMMJVM内存区域的划分是不同的概念层次,更恰当说JMM描述的是一组规则,通过这组规则控制程序中各个变量在共享数据区域和私有数据区域的访问方式,JMM是围绕原子性,有序性、可见性展开

JMM模型.png

Java内存模型内存交互操作

  • lock(锁定): 作用于主内存的变量,把一个变量标记为一条线程独占状态
  • read(读取): 作用于主内存的变量,把一个变量值从主内存传输到线程的工作内存中,以便随后的load动作使用
  • load(载入): 作用于工作内存的变量,它把read操作从主内存中得到的变量值放入工作内存的变量副本中
  • use(使用): 作用于工作内存的变量,把工作内存中的一个变量值传递给执行引擎
  • assign(赋值): 作用于工作内存的变量,它把一个从执行引擎接收到的值赋给工作内存的变量
  • store(存储): 作用于工作内存的变量,把工作内存中的一个变量的值传送到主内存中,以便随后的write的操作
  • write(写入): 作用于工作内存的变量,它把store操作从工作内存中的一个变量的值传送到主内存的变量中
  • unlock(解锁): 作用于主内存的变量,把一个处于锁定状态的变量释放出来,释放后的变量才可以被其他线程锁定

Java内存模型内存交互操作.png

把一个变量从主内存中复制到工作内存中,就需要按顺序地执行read和load操作,如果把变量从工作内存中同步到主内存中,就需要按顺序地执行store和write操作。但Java内存模型只要求上述8大操作(原子操作)必须按顺序执行,而没有保证必须是连续执行。

  1. 不允许一个线程无原因地(没有发生过任何assign操作)把数据从工作内存同步回主内存中
  2. 一个新的变量只能在主内存中诞生,不允许在工作内存中直接使用一个未被初始化(load或者assign)的变量。即就是对一个变量实施use和store操作之前,必须先自行assign和load操作。
  3. 一个变量在同一时刻只允许一条线程对其进行lock操作,但lock操作可以被同一线程重复执行多次,多次执行lock后,只有执行相同次数的unlock操作,变量才会被解锁。lock和unlock必须成对出现。
  4. 如果对一个变量执行lock操作,将会清空工作内存中此变量的值,在执行引擎使用这个变量之前需要重新执行load或assign操作初始化变量的值。
  5. 如果一个变量事先没有被lock操作锁定,则不允许对它执行unlock操作;也不允许去unlock一个被其他线程锁定的变量。
  6. 对一个变量执行unlock操作之前,必须先把此变量同步到主内存中(执行store和write操作)

目录
相关文章
|
2月前
|
Java 编译器 开发者
深入理解Java内存模型(JMM)及其对并发编程的影响
【9月更文挑战第37天】在Java的世界里,内存模型是隐藏在代码背后的守护者,它默默地协调着多线程环境下的数据一致性和可见性问题。本文将揭开Java内存模型的神秘面纱,带领读者探索其对并发编程实践的深远影响。通过深入浅出的方式,我们将了解内存模型的基本概念、工作原理以及如何在实际开发中正确应用这些知识,确保程序的正确性和高效性。
|
7月前
|
缓存 Java 编译器
JUC 并发编程之JMM
Java内存模型是Java虚拟机(JVM)规范中定义的一组规则,用于屏蔽各种硬件和操作系统的内存访问差异,保证多线程情况下程序的正确执行。Java内存模型规定了线程之间如何交互以及线程和内存之间的关系。它主要解决的问题是可见性、原子性和有序性。
|
1月前
|
存储 缓存 安全
Java内存模型(JMM):深入理解并发编程的基石####
【10月更文挑战第29天】 本文作为一篇技术性文章,旨在深入探讨Java内存模型(JMM)的核心概念、工作原理及其在并发编程中的应用。我们将从JMM的基本定义出发,逐步剖析其如何通过happens-before原则、volatile关键字、synchronized关键字等机制,解决多线程环境下的数据可见性、原子性和有序性问题。不同于常规摘要的简述方式,本摘要将直接概述文章的核心内容,为读者提供一个清晰的学习路径。 ####
47 2
|
5月前
|
算法 安全 Java
深入理解Java中的并发编程模型
深入理解Java中的并发编程模型
|
6月前
|
Java 程序员
深入理解Java内存模型(JMM)与并发编程
在Java并发编程领域,理解Java内存模型(JMM)是至关重要的。本文旨在通过数据导向的分析、科学严谨的论述和逻辑严密的结构,探讨JMM如何影响并发编程实践。我们将从JMM的基本概念出发,逐步深入到并发编程中的具体应用,包括同步机制、volatile关键字的作用以及线程间的通信。本文将引用权威研究与实验证据,结合经典理论,为读者提供全面的JMM知识框架,以促进对Java并发编程深层次的理解。
|
5月前
|
存储 缓存 安全
深入理解Java内存模型(JMM)及其在并发编程中的应用
本文旨在探索Java内存模型(JMM)的奥秘,并揭示其在并发编程中的关键作用。我们将通过数据支撑,案例分析,以及对比研究的方法,深入剖析JMM的核心概念、原理和机制。文章将提供丰富的实例,包括同步块、volatile关键字的使用,以及线程间的通信机制,来具体展示JMM如何管理并发环境下的数据一致性和可见性问题。我们还将讨论JMM在现代多核处理器架构下面临的挑战,以及如何在编写高效且线程安全的代码时避免常见的并发陷阱。最后,文章将提出一些最佳实践,帮助开发者充分利用JMM的特性,以提升应用程序的性能和可靠性。
|
7月前
|
安全 Java 开发者
Java并发编程中的线程安全性探究
在Java编程中,线程安全性是一个至关重要的问题,涉及到多线程并发访问共享资源时可能出现的数据竞争和不一致性问题。本文将深入探讨Java并发编程中的线程安全性,介绍常见的线程安全性问题以及解决方法,帮助开发者更好地理解和应对在多线程环境下的挑战。
|
7月前
|
分布式计算 安全 Java
线程状态:深入理解多任务并发编程中的精髓
线程状态:深入理解多任务并发编程中的精髓
|
缓存 安全 Java
Java并发编程学习2-线程安全性
本篇介绍 线程安全性,竞态条件,加锁机制
90 1
Java并发编程学习2-线程安全性
|
存储 缓存 Java
并发编程系列教程(05) - Java内存模型
并发编程系列教程(05) - Java内存模型
54 0