首页 > 系统相关 >Java并发—Java内存模型以及线程安全

Java并发—Java内存模型以及线程安全

时间:2024-08-01 15:53:13浏览次数:9  
标签:Java 变量 可见 线程 内存 JMM 有序性

目录

 

一、Java内存模型

JMM的核心概念

二、什么是线程安全? 

1、原子性

2、有序性

3、可见性

三、如何确保线程安全?

1、sychronized关键字

2、Lock接口和其实现

3、volatile关键字

4、Atomic原子类

5、ThreadLocal

6、不可变对象

7、并发集合类

8、并发工具类

9、Future和Callable


一、Java内存模型

在谈及线程安全前,需要了解内存模型一下

Java内存模型(Java Memory Model,JMM)是一种抽象的概念,JMM并不真实存在,它是一种规范规定了在Java并发编程中如何处理多线程之间的内存交互程序中变量在内存中的访问方式

5eb5081162df4468bfecc70ea194214c.jpeg

JMM的核心概念

1、主内存与工作内存:

主内存:是所有线程共享的内存区域,所有变量都存储在主内存中,主内存是共享的

工作内存每个线程都有自己的工作内存(局部变量存储区),线程对共享变量的所有操作都发生在工作内存中,然后同步回主内存

这种模型允许线程在本地缓存共享变量的副本,提高性能,但也带来了同步的复杂性

2、内存屏障

内存屏障(Memory Barrier)是JMM中用于控制内存访问顺序的指令。它确保指令序列中的内存读写操作按照特定的顺序执行,从而保证线程间的内存可见性和有序性

3、Happens-Before规则

Happens-Before是JMM中最核心的概念之一,它定义了一组偏序关系,用于判断两个操作之间的内存可见性和有序性,用于描述多线程程序中操作的执行顺序,确保了线程之间的正确通信和数据一致性

简而言之:如果在同一个线程中,操作A在操作B之前执行,那么我们说一个操作A happens-before 另一个操作B,那么A的执行结果对B是可见的,且A的执行顺序排在B之前,也就是先执行的操作的结果必须对后执行的操作可见

用一个例子来深入了解内存模型

标签:Java,变量,可见,线程,内存,JMM,有序性
From: https://blog.csdn.net/qq_36451127/article/details/140826529

相关文章

  • 基于Django的超市小程序+47822(免费领源码)可做计算机毕业设计JAVA、PHP、爬虫、APP、小
    基于django超市小程序摘 要随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,超市小程序被用户普遍使用,为方便用户能够可以随时进行超市小程序的数据信息管理,特开发了基于djan......
  • 制作java代码 Dockerfile
    DockerfileFROMmaven:3.6.2-jdk-8-slimASbuilderCOPYdigit/digit-life-service/build/WORKDIR/build/RUN--mount=type=cache,target=/root/.m2mvncleaninstall-Ptest-Dmaven.test.skip=trueFROMopenjdk:8-slimWORKDIR/appsCOPY--from=builder/bui......
  • 【Java】继承、super、final、子类构造方法
     目录1.为什么需要继承2.继承的概念3.继承的语法4.父类成员访问4.1子类和父类不存在同名成员变量1.子类和父类不存在同名成员变量 2.子类和父类成员变量同名4.2子类中访问父类的成员方法1.成员方法名字不同2.成员方法名字相同5.super关键字6.子类构造方法7.this......
  • 基于Java的电子产品销售网站【源码+文档+PPT】
    精彩专栏推荐订阅:在下方主页......
  • 基于Java房地产销售管理系统【源码+文档+PPT】
    精彩专栏推荐订阅:在下方主页......
  • java对象实例化
    什么是对象实例化在写代码时,我们用关键词class定义一个类其实只是定义了一个类的模板,没有在内存中实际产生一个类的实例对象,也没有分配内存空间。要想在内存中产生一个类的实例对象就需要使用new关键字申请分配内存空间,加上类的构造方法提供申请空间的大小规格,在内存中实际产生一......
  • 基于Java的二手图书交易系统【源码+文档+PPT】
    ......
  • Java SE核心技术——4数组
    一、数组的定义在计算机内存中开辟的连续的存储空间用于存放程序运行中多个相同类型的数据java中"类型[]"即数组,并且索引下标从0开始。数组的声明:1.数据类型[]数组名=new数据类型[数据的个数]int[]a;数组下标越界编译不会出错运行错误。int[]money=newint[100]数......
  • Java SE核心技术——5方法
    方法的作用在Java中,方法(Method)是一段具有特定功能的代码块,可以被重复调用。以下是一些Java方法的主要作用:封装性:方法可以封装一段代码,使得代码更加模块化,易于理解和维护。复用性:通过定义方法,可以避免重复编写相同的代码,提高代码的复用性。抽象性:方法可以隐藏实现细节,只暴露必......
  • java对象的销毁
    对象的销毁对象使用完之后需要对其进行清除。对象的清除是指释放对象占用的内存。在创建对象时,用户必须使用new操作符为对象分配内存。不过,在清除对象时,由系统自动进行内存回收,不需要用户额外处理。GC垃圾回收Java语言的内存自动回收称为垃圾回收(GarbageCollection)机制,简称......