JMM内存模型

2023-09-18 20:16:37

JMM

概念

JMM: Java Memory Model (JAVA 内存模型)。

是Java语言中用于定义多线程并发访问共享内存的规范。它规定了多线程环境下,如何保证共享内存的一致性和可见性,以及如何协调多个线程之间的操作。

在这里插入图片描述

主内存和工作内存(本地内存)

JMM将内存划分为主内存和每个线程的工作内存。主内存是所有线程共享的内存,而每个线程都有自己的工作内存。线程可以从主内存中读取数据到工作内存,然后进行操作,最后将结果写回主内存。

进程和线程

进程是操作系统中的一个独立执行单元,它包含了程序代码、数据和系统资源的副本。每个进程都有自己的地址空间,它们之间通常是相互隔离的。

线程是进程内的一个执行单元,多个线程共享同一个进程的地址空间和资源。一个进程可以包含多个线程。

进程是程序运行资源分配(内存)的最小单位;线程是CPU调度的最小单位。

并发和并行

Erlang 之父 Joe Armstrong 用一张5岁小孩都能看懂的图解释了并发与并行的区别。

在这里插入图片描述

并发是指应用程序交替执行任务。

并行是指应用程序同时执行不同的任务。

并发的三大特性

并发的三大特性:可见性,原子性,有序性

可见性

可见性是指一个线程修改了共享变量对其他线程是可见的。

实现方式

  1. volatile关键字
  2. 内存屏障
  3. sychronized关键字
  4. Lock
  5. final关键字

原子性

原子性是指一个操作不可分割,要么全部执行成功,要么全部失败。

实现方式

  1. sychronized关键字
  2. Lock
  3. CAS

有序性

即程序执行的顺序按照代码的先后顺序执行。

实现方式

  • 通过 volatile 关键字保证有序性

  • 通过 内存屏障保证有序性

  • 通过 synchronized关键字保证有序性

  • 通过Lock锁保证有序性

原子操作

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

在这里插入图片描述

sychronized

sychronized是Java的关键字,用来加锁。可以用于修饰方法和代码块。

synchronized关键字不仅保证可见性,同时也保证了原子性(互斥性)。

public class BankAccount {
    private int balance;

    public BankAccount(int initialBalance) {
        this.balance = initialBalance;
    }

    //sychronized修饰方法
    public synchronized void transfer(int amount) {
        if (balance >= amount) {
            balance -= amount;
            System.out.println("Transfer successful. Remaining balance: " + balance);
        } else {
            System.out.println("Insufficient funds.");
        }
    }
    
    public void performOperation(int increment) {
         //sychronized修饰代码块
        synchronized (this) {
            value += increment;
            System.out.println("Updated value: " + value);
        }
    }
      
}

如上面代码,

第一个synchronized修饰transfer方法,表示只有一个线程执行该方法。

第二个sychronized修饰代码块。表示只有一个线程可以同时进入这个代码块。

volatile

volatile 是 Java 中用于修饰变量的关键字,它具有特殊的语义,主要用于确保多线程环境下对共享变量的可见性和有序性。

Java中的volatile关键字可以保证多线程操作共享变量的可见性以及禁止指令重排序。

更多推荐

2023/9/17总结

VuedefineOptions为什么要使用defineOptions在有<scriptsetup>之前如果需要定义propsemit可以很容易的添加一个与setup平级的属性但是用了<scriptsetup>后就不能这样做了setup属性也就没有了,就不能添加与其平级的属性为了解决这个问题引入了defineProps

文件、预处理、位运算

10.2数据文件概述10.2.1ASCII文件与二进制文件ASCII文件就是“将需要保存到文件的信息使用ASCII字符表示,然后按照顺序将每个字符的ASCII码存储到文件中”。ASCII文件的优点是编码方式公开,可以被其它的文本编辑器打开;其缺点是效率比较低,信息冗余度高。二进制文件将数据在内存中的二进制形式原样存储到

十大排序算法及Java中的排序算法

文章目录一、简介二、时间复杂度三、非线性时间比较类排序冒泡排序(BubbleSort)排序过程代码实现步骤拆解演示复杂度选择排序(SelectionSort)排序过程代码实现步骤拆解演示复杂度插入排序(InsertionSort)排序过程代码实现步骤拆解演示复杂度二分插入排序(BinaryInsertionSort)代

数据可视化 -- ECharts 入门

文章目录引言1.ECharts的基本使用1.1ECharts的快速上手1.2相关配置讲解2.ECharts常用图表2.1图表1柱状图2.1.1柱状图的实现步骤2.1.2柱状图的常见效果2.1.3柱状图特点2.1.4通用配置2.2图表2折线图2.2.1折线图的实现步骤2.2.2折线图的常见效果2.2.3折线图的特点2.3

【iOS】单例模式

文章目录前言一、单例模式简介二、单例模式优缺点优点缺点三、模式介绍1.懒汉模式2.饿汉模式总结前言在最初进行OC的学习时笔者了解过单例模式的基本使用,现撰写博客加深对单例模式的理解一、单例模式简介单例模式是一种常见的设计模式,其主要目的是确保一个类只有一个实例,并提供全局访问点。这样就大大节省了我们的内存,防止一个实例

2023年7月京东平板电脑行业品牌销售排行榜(京东销售数据分析)

鲸参谋监测的京东平台7月份平板电脑市场销售数据已出炉!根据鲸参谋电商数据分析平台的相关数据显示,今年7月份,京东平台上平板电脑的销量为68万+,同比增长超过37%;销售额为22亿+,同比增长约54%。从价格上看,平板电脑的市场均价同比增长约12%。可以看到,与去年同期相比,今年7月平板电脑市场呈现出良好的增长态势。*数

Go语言高级特性解析与实践

1.并发模型与goroutineGo语言以其强大的并发模型而闻名,它的核心机制是goroutine。goroutine是一种轻量级线程,由Go运行时负责调度。我们可以通过go关键字创建goroutine,而不需要像传统的线程编程那样关注底层的线程管理。示例代码:packagemainimport("fmt""time"

蓝桥杯打卡第14天

文章目录最短路径最短路径一、最短路径OJ链接本题思路:本题是一道简单的图论题,用floyd算法还是比较简单的,因为代码很短,这里需要用一个backup用来保存未删除边时的情况。当走完一次floyd之后,拷贝给dist数组来进行删除边的处理。当然不拷贝回去直接用这个backup数组也是可以进行删边处理的。#include

GE IS420UCSCH2A-C-V0.1-A模拟量输入模块

GEIS420UCSCH2A-C-V0.1-A模拟量输入模块是一种用于数据采集和监测的电子模块,通常应用于工业控制系统、监测设备和自动化系统中。以下是可能与该模拟量输入模块相关的一些产品特点:多通道输入:GEIS420UCSCH2A-C-V0.1-A模拟量输入模块通常具有多个输入通道,允许同时连接多个模拟传感器或测量点

SQLite 学习笔记1 - 简介、下载、安装

SQLite简介SQLite是一款非常轻量级的关系数据库系统,支持多数SQL92标准。SQLite是世界上使用最广泛的数据库引擎。SQLite内置于所有手机和大多数计算机中,并捆绑在人们每天使用的无数其他应用程序中。SQLite是一个由C语音开发的嵌入式库,具有小型、快速、自包含、高可靠、功能齐全等特点。SQLite特

黑马JVM总结(十六)

(1)垃圾回收器垃圾回收器分为以下:吞吐量:垃圾回收时间占程序回收时间的一个占比,占比越低,吞吐量越高(2)垃圾回收器_串行使用上面的开启串行垃圾回收器的JVM参数,它分为两个部分Serial工作在新生代,采用复制算法,SerialOld工作在老年代,采用标记+整理算法新生代和老年代的垃圾回收器是分别运行的,新生代空间

热文推荐