Java内存模式以及volatile关键字的使用

1.Java内存模型

(1)Java 内存模型(Java Memory Model,简称 JMM),它是一个抽象的概念,JMM是和多线程相关的,它是一组规范,描述了一组规则,定义了多线程对共享变量读写操作时的行为规范,通过这些规则来规范对内存的读写操作,从而保证多线程对共享数据操作的原子性、可见性以及有序性。

(2)同时通过这套规范,屏蔽掉底层不同操作系统、不同 CPU 硬件之间的差异,让 Java 程序员按照统一的方式来编程,保证 Java 程序在各种平台下对内存的访问都能够得到相同的效果

(3)具体如下:

①所有的变量都存储在主内存中,每个线程都可以访问;

②每条线程都有自己私有的工作内存;

③线程的工作内存中保存了该线程中用到的主内存变量的副本拷贝;

④线程对变量的所有操作都必须在工作内存中进行,而不能直接操作主内存;

⑤不同线程之间也无法直接访问对方工作内存中的变量

2.volatile

(1)volatile关键字只能修饰类变量和实例变量,对于方法参数、局部变量以及实例常量、类常量都不能进行修饰;

(2)volatile 的主要作用是使共享变量在多线程间可见,如果一个字段被声明成 volatile,Java 线程内存模型会确保所有线程看到这个变量的值都是一致的

(3)volatile 可以保证可见性,不能保证原子性,volatile 也可以保证有序性

2.1 volatile 的使用场景

(1)在一些对变量的操作已经是原子性的情况下,可以使用 volatile 关键字;

(2)运行结果并不依赖变量的当前值,可以使用 volatile 关键字,volatile 不适合复合操

作,像 i++这种类型操作不适合使用 volatile; int a=10; a = 20;

(3)一些状态标志的场景,比如仅仅是使用一个布尔状态 true 和 false 标志;

(4)定期更新,供程序内部使用的变量,可以使用 volatile;

(5)双重检查锁定(double-checked-locking)问题可以用 volatile;

注:如果对共享变量已经加锁,加锁本身已经保证了可见性、原子性、有序性,此时就没必要再使用 volatitle

相关推荐
源代码•宸2 小时前
分布式缓存-GO(分布式算法之一致性哈希、缓存对外服务化)
开发语言·经验分享·分布式·后端·算法·缓存·golang
云和数据.ChenGuang2 小时前
PHP-FPM返回的File not found.”的本质
开发语言·php·运维工程师·运维技术
It's now2 小时前
Spring AI 基础开发流程
java·人工智能·后端·spring
cxh_陈2 小时前
线程的状态,以及和锁有什么关系
java·线程·线程的状态·线程和锁
计算机毕设VX:Fegn08952 小时前
计算机毕业设计|基于springboot + vue图书商城系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·课程设计
R.lin2 小时前
Java 8日期时间API完全指南
java·开发语言·python
毕设源码-赖学姐2 小时前
【开题答辩全过程】以 高校教学质量监控平台为例,包含答辩的问题和答案
java·eclipse
高山上有一只小老虎2 小时前
翻之矩阵中的行
java·算法
yangpipi-2 小时前
《C++并发编程实战》 第4章 并发操作的同步
开发语言·c++
火钳游侠3 小时前
java单行注释,多行注释,文档注释
java·开发语言