java中的voliatile变量,在java中右有两个语义
1.可见性,每次voliatile变量修改时,都会直接写到主内存中
2.有序性,
1.可见性,
表现为每次voliatile变量修改时,都会直接写到主内存中,另外每个线程读取voliatile变量时,都会从主内存中读取,但是voliatile变量不能保证变量的安全性,具体原因我们稍后讨论,有人问,voliatile变量怎么保证数据在线程间的可见性,详细的过程如下
在JVM中,为了避免系统以及硬件在内存间的访问差异:JVM提供了自己的内存模型来定义程序中各个变量的访问规则,也就是虚拟机中的变量从存储到内存和从内存中取出变量的底层细节,
这个变量不包括,局部变量和方法参数,因为时线程私有的,不存在竞争的问题,
java的内存模型有三部分组成:线程,工作内存,主内存;
每一个线程有自己的一个工作内存,在线程运行时,会将需要的变量从主内存中copy到工作内存中,如果线程中有对变量的赋值,会先更新工作内存,然后在更新到主内存中;主内存一般是我们说到JVM堆,而工作内存对于虚拟栈中的部分区域(局部变量表,保留引用,但是不会保留内存对象),一般为了运行的效率,JVM会将工作内存放在寄存器和高速缓存中,
在JVM中,工作内存与主内存之间的交互过程,
1.线程读取主内存中的数据,将数据复制到工作内存中(寄存器,高速缓存行)
2.经过线程中的运算复制,改变了数据的值,将数据覆盖本线程的工作内存中,然后再回写到主内存
往往再2的过程中(非原子性操作),因为线程间缺少同步机制的及线程间无序性(从一个线程观察另外一个线程,另外一个线程操作总是无序的,而且无同步机制的情况下,线程之间的调度完全依靠cpu调度器,不能保证线程的执行顺序),引发线程的安全问题,也就是各线程之间的数据相互覆盖,会影响最后的结果,同时,个线程之间的数据也是相互不可见的,因为线程间的工作内存是线程独享的,
但是voliatile 修饰的变量却可以达到线程间数据的可见性,即每一个线程中的数据被更新时,其他线程可以马上看到,这个是因为经过voliatile修饰的变量,再复制操作时,会多加一个“lock”这样的指令,这个指令有两个语义,1.可以更新当前线程的工作内存,并且同时使其他线程的工作内存的数据失效,并同时回写到主内存中,当其他线程再读取这个值时(此值以及存在本线程的工作内存了),回被告知,此值以及过期(内存屏障),会重新去主内存中获取这个值,这样就保证了一个线程的数据修改,可以让其他线程可见,也就是可见性的解释。另外一个语义就是,这个语句后的操作,不能被重排序到这个语句之前,一定程度上可以保证操作的有序性,虽然不是完全意义上的有序。第三个,这个语句前的非voliatile变量操作,也是被当中可见性的操作,让其他线程的数据失效,并会写到主内存中,这个有点屌!!
2.有序性
刚才提到 voliatile 修饰的变量被修改时,后面的操作不能被重排序到 修改操作之前,必须等到 变量修改完成才能,进行后续的操作,这个就是所说的 有序性
分享到:
相关推荐
Java 生成 PublicKey 方法 Java 生成 PublicKey 方法是 Java 开发语言中一个重要的知识点,本文将对其进行详细的讲解。 首先,需要了解什么是 PublicKey?PublicKey 是一种加密算法中使用的公钥,用于加密和解密...
总结来说,USB Key与Java的结合为安全编程提供了一种强大的工具,开发者需要掌握Java USB API,理解USB Key的硬件特性和安全机制,才能有效地开发和应用USB Key。通过深入学习和实践,可以提升系统的安全性,并为...
### Java操作Word模板实现动态数据输出 #### 一、引言 随着信息技术的发展,特别是数据库技术和网络技术的进步,许多企事业单位对于内部数据管理和外部信息发布的方式也在不断演变。当前,大多数单位倾向于将数据...
在Java编程环境中,实现Word文档中的中文到英文的转换是一项技术挑战,但通过利用特定的库和API,这个任务是可以完成的。以下是一篇详细解释如何实现这一目标的文章。 首先,我们需要选择一个能够处理Microsoft ...
在Java开发中,有时我们需要处理Word文档,例如批量替换文档中的特定占位符文本,这在生成报告或自定义模板时非常常见。标题"java替换word占位符.zip"和描述"java 替换word 占位符"都指向了这个应用场景。在Java中...
`java中对单层json进行key字母排序`的标题指出了我们需要对一个单层JSONObject的键进行字母升序排序。描述提到这个资源可以直接在程序中使用,意味着提供了一个功能函数来实现这一操作。 在提供的代码中,可以看到...
Java Properties文件是Java编程语言中用于存储配置信息的文本文件,通常以.key=value的形式存储键值对。这种文件格式在Java应用中广泛用于保存应用程序的配置参数、国际化字符串或者数据库连接信息等。读取...
Apache POI是一个开源项目,它允许Java开发者处理Microsoft Office格式的文件,如Excel(.xlsx或.xls)和Word(.docx)。 首先,我们需要导入Apache POI的相关依赖。在Maven项目中,可以在pom.xml文件中添加以下...
Aliexpress key word是一款为速卖通平台设计的辅助工具。它可以根据关键字查找所有相关资料,这款软件工具简单好用,完全免费实用性很高,需要的用户快来下载吧。 基本简介 速卖通关键字工具仅针对速卖通平台,本...
"GenerateKey.java"、"EncryptClasses.java"以及"Util"、"DecryptStart"这些标签暗示了这是一个关于Java加密和解密操作的项目。下面将详细讨论相关知识点。 1. **GenerateKey.java**: 这个文件很可能包含了生成...
以下将详细介绍如何在Java中读取含中文key的Properties文件,并利用反射调用相关方法。 首先,我们需要理解Java的Properties类。`java.util.Properties`是Java标准库中的一个类,它提供了一种加载和保存属性列表的...
这个过程可以通过Apache POI库来实现,该库允许Java程序员读取、创建和修改MS Office格式的文件,包括Word文档。Apache POI提供了一个API,可以方便地访问和操作Word文档的内容。 首先,我们需要在项目中引入Apache...
Java中 List《map》把里面map中某个key相同记录的其他key 的 value 合并 Java中 List《map》把里面map中某个key相同记录的其他key 的 value 合并
在Java编程环境中,有时会遇到一个常见的错误:"java.security.InvalidKeyException: Illegal key size"。这个错误通常是由于Java安全策略的限制导致的,尤其是当你尝试使用超过默认限制的密钥长度(例如,超过128位...
这个"Key_Word.rar"文件可能包含的就是一个实现这种框架的示例或工具包。关键字驱动测试方法的核心思想是将复杂的测试逻辑转化为易于理解的关键字,使得非技术人员也能编写和维护测试脚本。 关键字驱动框架的主要...
java 遍历 memcache key 源码 方法
在Java编程中,`java.security.InvalidKeyException: Illegal key size` 是一个常见的错误,通常出现在加密或解密操作中,尤其是涉及到对称加密算法如AES(高级加密标准)时。这个错误表明您试图使用的密钥长度不受...
USB KEY与Java CA(Java证书权威机构)相结合,可以实现更高级别的身份验证和数据加密。 Java CA是负责签发和管理数字证书的机构,其工作基于公钥基础设施(PKI)原理。Java CA为用户、服务器和其他实体提供信任...
在Java编程中,Apache POI库是一个非常实用的工具,它允许开发者操作Microsoft Office格式的文件,包括Word(.doc)文档。在这个“java简单操作word实例”中,我们将探讨如何使用Apache POI来创建和修改Word文档。 ...