java 易变变量_关于java:易变变量和其他变量

以下是经典Concurency in Practice的内容:

When thread A writes to a volatile variable and subsequently thread B

reads the same variable, the values of all variables that were

visible to A prior to writing to the volatile variable, become visible

to B after reading the volatile variable.

我不确定我是否真的能理解这一说法。 例如,在这种情况下,所有变量的含义是什么? 这是否意味着使用volatile也会对非易失性变量的使用产生副作用?

在我看来,这种说法具有我无法理解的一些微妙含义。

有什么帮助吗?

您的问题的答案在JLS#17.4.5中:

A write to a volatile field (§8.3.1.4) happens-before every subsequent read of that field.

所以如果在一个线程中

aNonVolatileVariable = 2 //w1

aVolatileVariable = 5 //w2

然后在另一个线程中:

someVariable = aVolatileVariable //r1

anotherOne = aNonVolatileVariable //r2

您可以保证anotherOne等于2,即使该变量不是volatile。因此,是的,使用volatile对使用非易失性变量也有副作用。

更详细地说,这是由于同一部分中的Java内存模型(JMM)提供了2个其他保证:线程内顺序和可传递性(hb(x,y)表示x发生在y之前):

If x and y are actions of the same thread and x comes before y in program order, then hb(x, y).

[...]

If hb(x, y) and hb(y, z), then hb(x, z).

在我的示例中:

hb(w1,w2)和hb(r1,r2)(线程内语义)

hb(w2,r1)由于易失性保证

因此您可以通过传递性得出hb(w1,r2)的结论。

而且,JMM保证,如果程序与事前发生的关系正确同步,则该程序的所有执行将保持顺序一致(即,看起来好像什么都没有重新排序)。因此,在这种特定情况下,非易失性读取可确保看到非易失性写入的效果。

很抱歉,我无法从JSL的语句中看到这种保证,它只表示对volatile happens-before的写操作读取了该字段,这又如何保证在另一个线程中< x6>可见为2?

到目前为止,我理解hb(w1, r2) .Ok,但是为??什么在这里强制要求2的更新值可见?难道是,写入发生在之前,但是读取使用了一个缓存值而不是该值从w1开始?这是我无法获得的部分。hb(w1, r2)的定义是否还包括可见性方面?

@Cratylus JMM保证正确同步的程序(具有先发生的关系)将保持顺序一致:"对于程序员,这是极其有力的保证。[...]一旦确定代码正确同步,程序员不必担心重新排序会影响他或她的代码。"

@Cratylus在同一部分中,JLS的另一句话是:"在一组一致的动作之前发生的情况下,每次读取都会看到一个写,该顺序允许在顺序发生之前看到它。"

这些说明不能解决由于重新排序而导致的不可见性吗?不会进行重新排序,但是如何在寄存器中缓存值呢?

@Cratylus"顺序一致"保证可见性。这是另一个引言(17.4.3):"顺序一致性是对程序执行中的可见性和顺序的非常有力的保证。在顺序一致的执行中,所有单个动作(例如读写),这与程序的顺序是一致的,并且每个动作都是原子的,每个线程都可以立即看到。"

这意味着如果您要写入10个非易失性变量并写入易失性变量,则必须在易失性变量之前设置所有非易失性变量。

如果您读取了volatile变量和所有非易失性变量,则可以确保订单不会被交换。

你在说什么顺序?volatile变量不能重新排序,好,所以volatile变量不应该用非易失性重新演算并最后写入,但是非易失性变量的顺序可以还可以改变吧?

在易失性变量中设置的值的顺序不能相对于其他变量(易失性或其他)更改,但是对于非易失性变量可能会发生这种情况。这意味着,当您设置易失性变量时,所有先前设置的值即使不是易失性的,也会被设置为缓存连贯的。

什么是缓存一致性?它们也不会被缓存?

它们将被缓存,但是CPU确保每个缓存看到相同的值(或将按需请求)。每个套接字具有2个或3个级别的多个缓存。它们具有通信总线,以确保它们在需要时彼此同步。甚至多个套接字也会通信以保持同步,从而避免了必须从主存储器中写入/读取值的情况。

但是为什么非易失性变量需要并保证这种同步呢,仅仅因为它们恰好是在写入volatile之前发生的,它们如何受到影响?

同步以一致的方式提供了更多的保证,例如读取和写入,例如增量。仅阅读或写作通常不是您所需要的。 volatile的定义使得在它之前发生的所有写入都不得在它之后发生。

all writes which occur before it must not occur after it。我理解这一点,但这如何取决于/对缓存一致性产生副作用?这是我不关注的部分

我认为这里有些混乱。我见过很多人评论说,volatile关键字会影响第一级和第二级缓存等的处理器缓存一致性。我不知道这怎么可能是正确的。一方面,高速缓存一致性协议可确保同一内存位置的多个线程视图始终保持同步。 VM更有可能为每个线程维护一个单独的内存缓存区域,而volatile关键字调用一些用于同步它们的代码。

JVM仅使用执行高速缓存一致性读取和写入的指令或不执行高速缓存一致性的简单读取和写入的指令。它不执行CPU本身不支持的任何操作。此外,JVM可以优化非易失性字段的读取方式,这意味着它们永远不会看到更新,因为它们不会在同一线程中被更改。

彼得,我的意思是,我不认为您所指的缓存与处理器缓存相同。而是由VM维护的缓存。换句话说,如果两个线程读取两个不同的值,则它们正在从两个不同的内存地址读取。如果两个线程从同一地址读取,则处理器缓存一致性协议将保证它们都接收相同的值。那是我的理解。如果我错了,那么我想知道。

VM不维护此类缓存。当您从两个不同的缓存中读取相同的地址时,可以获得不同的值。并非对所有CPU指令都强制执行缓存一致性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/561550.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java违反唯一约束异常_Caused by: java.sql.BatchUpdateException: ORA-00001: 违反唯一约束条件 (DSPACE.SYS_C007868)...

Caused by: java.sql.BatchUpdateException: ORA-00001: 违反唯一约束条件 (DSPACE.SYS_C007868).............................遇到这种问题解决方法1. 使用 约束条件查找包含的表明以及 表的字段select a.constraint_name,a.constraint_type,b.column_name,b.table_namefrom…

js中的if与Java中的if_JS直接if参数的用法JS中!和!!区别

经常在JS中见一些代码直接if(参数)&#xff0c;然后参数调用的时候是将元素自己传下去。例如下面代码:functiontest1(obj){if(obj){alert($(obj).val());}else{alert("has not obj");}}我们分别点击上面的两个输入框显示如下:解释:实际上相当于java中的重载&#xff…

vs2019能写Java吗_Visual studio2019打包程序过程

要想打包visual studio中的程序我们需要用到setup用于自定义安装部署的项目方案。但是在VS2019中不见了&#xff0c;微软是有意废除安装项目的&#xff0c;合作了一个第三方的安装项目单独使用。我们可以从官网上把Visual Studio Installer 项目扩展下载下来。地址&#xff1a;…

java各个版本的特性_Java各个版本的新特性

原链接&#xff1a;http://blog.csdn.net/shareus/article/details/507361591.51.自动装箱与拆箱&#xff1a;2.枚举(常用来设计单例模式)  http://www.jb51.net/article/78351.htm3.静态导入4.可变参数5.内省1.61.Web服务元数据2.脚本语言支持3.JTable的排序和过滤4.更简单,…

java继承的终极奥义_java学习笔记12-继承

继承就是子类继承父类的特征和行为有时候单一划分某个类别并不能处理所有情况&#xff0c;某些类别下有明显不同的子类&#xff0c;这些子类虽然拥有类似的行为和属性&#xff0c;但是他们各自发生的这些行为的方式或者属性对某些结果的影响是不一样的&#xff0c;这就需要划分…

flink java 并行度_flink solt和并行度

简介Flink运行时主要角色有两个&#xff1a;JobManager和TaskManager&#xff0c;无论是standalone集群&#xff0c;flink on yarn都是要启动这两个角色。JobManager主要是负责接受客户端的job&#xff0c;调度job&#xff0c;协调checkpoint等。TaskManager执行具体的Task。Ta…

php中多选提交如何获取,php中checkbox值获取,显示,多选值获取

php教程中checkbox值获取&#xff0c;显示&#xff0c;多选值获取最简单checkbox获取值代码checkboxdemocheckboxdemodemonstrates checkboxes"handleformcheckbox.php">"11.00">fries"chksoda" value "12.85">soda"ch…

php对mysql的操作教程,php与Mysql的一些简单的操作

先贴代码复制代码 代码如下:数据库相关$con mysql_connect("localhost","root","root"); //链接数据库if(!$con){die(连接失败&#xff01; . mysql_error()); //判断是否成功}/* if(mysql_query("CREATE DATABASE testdb&qu…

php curl curlopt_getfields,PHP中CURL的CURLOPT_POSTFIELDS参数使用细节

核心提示&#xff1a;CURL确实是一个不错的好工具&#xff0c;不仅在PHP中还是其他的操作系统中&#xff0c;都是一个非常好用的。但是如果你有些参数没有用好的话&#xff0c;那可能会得不到自己理想中的结果。CURL确实是一个不错的好工具&#xff0c;不仅在PHP中还是其他的操…

java 写传奇游戏吗,文字版传奇游戏

学习java中IO操作自己写的一个小文字游戏&#xff0c;写了一天半两千多行&#xff0c;有点low的&#xff0c;因为没有使用到数据库&#xff0c;所以数据存放在文本文档中&#xff0c;大部分代码都是在处理往文档中读写内容&#xff0c; 就显得有些繁琐&#xff0c;主要锻炼了自…

【Dart】P0 Win、Mac 使用与安装

Dart 使用与安装 Dart 下载安装Windows 版本MacOS版本处于境外安装 Dart 开发工具 Dart 下载安装 Windows 版本 安装网址&#xff1a; http://gekorm.com/dart-windows/ 安装后测试&#xff1a; dart --versionMacOS版本 首先安装 Homebrew&#xff1a; 终端输入&#xff…

php 邮箱开发教程,php开发中表单验证邮箱及URL的教程

这篇文章讲述的是php开发中表单验证邮箱及URL的教程。下面是小编整理于php培训班的笔记&#xff0c;希望学过的同学可以能够起到回顾作用。同时也能帮助没有接触到的同学。PHP 表单验证 - 验证 E-mail 和 URLPHP 表单必填PHP 表单完成本节展示如何验证名字、电邮和 URL。PHP - …

matlab函数算错,函数是这个样子的,我是不懂应该怎么输入,试了好多种情况都是错...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼函数全部如下&#xff1a;function [Graph,varargout] GraphLoad(FileName,IndexFileName,SkipSqueeze,varargin)% Loads a graph from file%% Receives:% FileName - string - the file to load% Nx2 of integers - the actual l…

defaultdict python3,Python collections.defaultdict() 与 dict的使用和区别|python3教程|python入门|python教程...

https://www.xin3721.com/eschool/python.html在Python里面有一个模块collections&#xff0c;解释是数据类型容器模块。这里面有一个collections.defaultdict()经常被用到。主要说说这个东西。综述&#xff1a;这里的defaultdict(function_factory)构建的是一个类似dictionary…

matlab 当已知两个矩阵满足分别一定条件时_程序继续执行,MATLAB程序设计基础

2.1常量与变量2.1.1 特殊常量变量名功 能 说 明ANS(ans)缺省变量名&#xff0c;以应答最近一次操作运算结果i或j虚数单位Pi圆周率NaNNot-a-number,表示不定值tic秒表开始执行INF(inf)代表无穷大toc秒表停止Date日历Clock时钟2.1.2一般变量变量命名遵守的原则&#xff1a;1、 变…

java 四人帮,Java PatternDesign of GOF(四人帮巨著,享誉15年)第十五模式

Java PatternDesign of GOF(四人帮力作&#xff0c;享誉15年)第十五模式Java PatternDesign of GOF(四人帮力作&#xff0c;享誉15年)第十五模式板桥里人 http://www.jdon.com 2002/04/21(转载请保留)Chain of Responsibility(CoR) 是用一系列类(classes)试图处理一个请求reque…

php火车订票系统设计论文,基于JSP的火车票订票系统 JSP146(毕业设计+论文)

摘 要随着科学技术的不断提高&#xff0c;计算机科学日渐成熟&#xff0c;其强大的功能已为人们深刻认识&#xff0c;它已进入人类社会的各个领域并发挥着越来越重要的作用&#xff61; 作为计算机应用的一部分使用计算机对火车信息进行管理&#xff0c;具有手工管理所无法比拟…

php cachelock,巧用lock解决缓存击穿的解决方案

背景缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期)&#xff0c;这时由于并发用户特别多&#xff0c;同时读缓存没读到数据&#xff0c;又同时去数据库去取数据&#xff0c;引起数据库压力瞬间增大&#xff0c;造成过大压力。解决方案1、设置热点数据永远不过期…

nginx php 防止跨站,Nginx下多网站单独php-fpm进程目录权限防跨站

Nginx下开多个虚拟机网站防跨站是首要的任务&#xff0c;PHP5.3之前的版本不支持open_basedir&#xff0c;只能通过控制PHP-cgi进程及目录用户权限进行限制&#xff0c;防止跨站访问。先了解一下网站正常运行所用到的用户、目录权限&#xff1a;Nginx进程运行用户&#xff1a;接…

php wmi,window_Win7系统中的wmi控件是什么?有什么用?,  wmi控件是什么Windows - phpStudy...

Win7系统中的wmi控件是什么&#xff1f;有什么用&#xff1f;wmi控件是什么Windows Management Instrumentation (WMI) 控件是一种工具&#xff0c;可以用它配置远程计算机或本地计算机上的 WMI 设置。wmi控件功能1、备份储存库可以配置 WMI 控件以定期备份 WMI 储存库&#xf…