Java关键字volatile的内存可见性和禁止指令重排特性,如何影响多线程并发编程?
- 内容介绍
- 文章标签
- 相关推荐
本文共计2390个文字,预计阅读时间需要10分钟。
volatile关键字是Java提供的一种轻量级同步机制。它能确保可见性和有序性,但不能保证原子性。对于volatile变量的可见性,代码示例如下:
javavolatile boolean flag=true;
public void method() { // 模拟代码执行 if (flag) { // 执行相关操作 }}
volatile是什么
volatile关键字是Java提供的一种轻量级同步机制。它能够保证可见性和有序性,但是不能保证原子性
可见性
对于volatile的可见性,先看看这段代码的执行
flag默认为true 创建一个线程A去判断flag是否为true,如果为true循环执行i++操作两秒后,创建另一个线程B将flag修改为false 线程A没有感知到flag已经被修改成false了,不能跳出循环
这相当于啥呢?相当于你的女神和你说,你好好努力,年薪百万了就嫁给你,你听了之后,努力赚钱。3年之后,你年薪百万了,回去找你女神,结果发现你女神结婚了,她结婚的消息根本没有告诉你!难不难受?
女神结婚可以不告诉你,可是Java代码中的属性都是存在内存中,一个线程的修改为什么另一个线程为什么不可见呢?这就不得不提到Java中的内存模型了,Java中的内存模型,简称JMM,JMM定义了线程和主内存之间的抽象关系,定义了线程之间的共享变量存储在主内存中,每个线程都有一个私有的本地内存,本地内存中存储了该线程以读/写共享变量的副本,它涵盖了缓存、写缓冲区、寄存器以及其他的硬件和编译器优化。
注意!JMM是一个屏蔽了不同操作系统架构的差异的抽象概念,只是一组Java规范。
本文共计2390个文字,预计阅读时间需要10分钟。
volatile关键字是Java提供的一种轻量级同步机制。它能确保可见性和有序性,但不能保证原子性。对于volatile变量的可见性,代码示例如下:
javavolatile boolean flag=true;
public void method() { // 模拟代码执行 if (flag) { // 执行相关操作 }}
volatile是什么
volatile关键字是Java提供的一种轻量级同步机制。它能够保证可见性和有序性,但是不能保证原子性
可见性
对于volatile的可见性,先看看这段代码的执行
flag默认为true 创建一个线程A去判断flag是否为true,如果为true循环执行i++操作两秒后,创建另一个线程B将flag修改为false 线程A没有感知到flag已经被修改成false了,不能跳出循环
这相当于啥呢?相当于你的女神和你说,你好好努力,年薪百万了就嫁给你,你听了之后,努力赚钱。3年之后,你年薪百万了,回去找你女神,结果发现你女神结婚了,她结婚的消息根本没有告诉你!难不难受?
女神结婚可以不告诉你,可是Java代码中的属性都是存在内存中,一个线程的修改为什么另一个线程为什么不可见呢?这就不得不提到Java中的内存模型了,Java中的内存模型,简称JMM,JMM定义了线程和主内存之间的抽象关系,定义了线程之间的共享变量存储在主内存中,每个线程都有一个私有的本地内存,本地内存中存储了该线程以读/写共享变量的副本,它涵盖了缓存、写缓冲区、寄存器以及其他的硬件和编译器优化。
注意!JMM是一个屏蔽了不同操作系统架构的差异的抽象概念,只是一组Java规范。

