volatile写读的内存语义

1,当写一个volatile变量时,JMM(java内存模型)会把该线程本地内存中的所有共享变量刷新到主内存中去

2,当读取一个volatile变量时,该线程会将本地内存置为无效,线程将从主内存中读取共享变量。

总结,volatile变量可以实现线程之间的通信。

当对一个volatile变量写操作时,实际上就是指明我对主内存中的共享变量产生更改,接下来读取这个volatile变量的线程就会从主线程中取回最新的共享变量值。

时间: 2024-11-08 11:47:06

volatile写读的内存语义的相关文章

Java内存模型-volatile的内存语义

一 引言 听说在Java 5之前volatile关键字备受争议,所以本文也不讨论1.5版本之前的volatile.本文主要针对1.5后即JSR-133针对volatile做了强化后的了解. 二 volatile的特性 开门见山,volatile变量自身具有以下特性: 可见性(最重要的特性).对一个volatile变量的读,总是能看到(任意线程)对这个volatile变量最后的写入. 原子性.对任意(包括64位long类型和double类型)单个volatile变量的读/写具有原子性.但是类型于a

java并发学习--第十章 java内存模型的内存语义

一.锁的内存语义 所为的java内存模型的内存语义指的就是在JVM中的实现原则. 锁的内存语义:锁除了让临界区互斥执行外,还可以让释放锁的线程向获取同一个锁的线程发送消息. 我们把上面这句话再整理下: 当线程释放锁时,JMM会把该线程对应的本地内存中的共享变量刷新到主内存中. 当线程获取锁时,JMM会把该线程对应的本地内存置为无效.从而使得被监视器保护的临界区代码必须要从主内存中去读取共享变量. 锁的内存语义实现: synchronized.ReentrantLock: 二.volatile内存

内存屏障和volatile内存语义的实现

趁周末,把以前的书拿出来,再翻一番,顺便做个笔记: 内存屏障:用来控制和规范cpu对内存操作的顺序的cpu指令. 内存屏障列表: 1.loadload:确保"前者数据装载"先于"后者装载指令": 2.storestore:确保"前者数据"先于"后者数据"刷入系统内存,且,"前者刷入系统内存的数据"对"后者是可见的": 3.loadstore:确保"前者装载数据"先于&

Java并发编程之final域的内存语义

一.final域的重排序规则 对于final域,编译器和处理器要遵循两个重拍序规则: 1.在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序. 2.初次读一个包含final域的对象的应用,与随后初次读这个final域,这两个操作之间不能重排序 下面通过一个示例来分别说明这两个规则: public class FinalTest { int i;//普通变量 final int j; static FinalTest obj; publi

java多线程03-----------------volatile内存语义

java多线程02-----------------volatile内存语义 volatile关键字是java虚拟机提供的最轻量级额的同步机制.由于volatile关键字与java内存模型相关,因此,我们在介绍volatile关键字之前,对java内存模型进行更多的补充(之前的博文也曾介绍过). 1. java内存模型(JMM) JMM是一种规范,主要用于定义共享变量的访问规则,目的是解决多个线程本地内存与共享内存的数据不一致.编译器处理器的指令重排序造成的各种线程安全问题,以保障多线程编程的原

Java内存模型-final域的内存语义

一 引言 说到final你肯定知道它是Java中的关键字,那么它所在Java中的作用你知道吗?不知道的话,请前往这篇了解下https://www.cnblogs.com/yuanfy008/p/8021673.html 今天我们来说说final域在JMM中的内存语义. 二 final域的重排序规则 开门见山,对于final域,编译器和处理器一定要遵守两个重排序规则(JSR-133才增强了final域): 1)在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这

Java并发编程原理与实战四十四:final域的内存语义

一.final域的重排序规则 对于final域,编译器和处理器要遵循两个重拍序规则: 1.在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序. 2.初次读一个包含final域的对象的应用,与随后初次读这个final域,这两个操作之间不能重排序 下面通过一个示例来分别说明这两个规则: public class FinalTest { int i;//普通变量 final int j; static FinalTest obj; publi

volatile-最轻量级的并发实现及其内存语义

原文连接:(http://www.studyshare.cn/blog-front/blog/details/1163/0 ) 一.volatile定义 volatile是java并发编程中修饰类的成员变量.成员属性或者对象的一个关键字.是java并发编程中最轻量级的 并发实现,保证所修饰的变量对多个线程内存可见.在一个线程写,多个线程读的场景下,首选使用volatile关键字. 二.使用案例 此处用一个线程安全的单例模式来说明volatile具体的使用场景和原理,首先,线程安全的单例模式是很多

锁的内存语义

锁是Java并发编程中最重要的同步机制.锁除了让临界区互斥执行外,还可以让释放锁的线程向获取同一个锁的线程发送消息. 锁的获取和释放 线程释放锁时,JMM会把该线程对应的本地内存中的共享变量刷新到主内存中. 线程获取锁时,JMM会把该线程对应的本地内存置为无效.从而使得被监视器保护的临界区代码必须从主内存中读取共享变量. 在共享变量的可见性方面,锁的释放和获取和volatile是类似的. 对volatile变量进行写操作,JMM会把该线程对应的本地内存中的共享变量刷新到主内存中. 对volati