Java知识分享
热爱技术,分享技术

volatile与Java内存模型

volatile是java虚拟机提供的轻量级的同步机制

volatile的三大特性:1.保证可见性 2.不保证原子性 3.禁止重排序

要说到volatile首先要了解java内存JMM。

JMM(Java内存模型 java Memory Model) 本身是一种抽象的概念(并不真实存在),它描述的时一组规范或者规则。通过这组规范定义了程序中各个变量(包括实例字段、静态字段和构成的数组对象的元素)的访问方式

关于JMM同步的规定:

1.线程解锁前:必须把共享变量的值刷新回主内存

2.线程加锁前:必须读取主内存的最新值到自己的工作内存

3.加锁解锁是同一把锁

由于JVM运行程序的实体是线程,而每个线程创建时JVM都会为其创建一个工作内存(有些地方称为栈内存),工作内存是每个线程的私有数据区域,而java内存模型规定所有的变量都存在主内存,主内存是共享内存区域,所有线程都可以访问。

但线程对变量的操作必须在工作内存中进行,首先要将变量从主存中拷贝到自己的私有工作内存空间。然后对变量进行操作,所以当多个线程同时操作共享区域的变量时,会导致多个线程之间彼此不可见。

假如A. main 2个线程同时操作一个共享变量C,A赋值C为0,可能main读取到的值可能还是0。使用volatile关键字可以保证变量C在多线程环境是可见的。

可见性代码验证:

 public class TestVolatile {
	public static void main(String[] args) {
		MyVolatile myVolatile = new MyVolatile();

		new Thread(() -> {
			try {
				TimeUnit.SECONDS.sleep(3);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			myVolatile.add();
			System.out.println(Thread.currentThread().getName() + ":" + myVolatile.c);
		}, "A").start();
		while (myVolatile.c == 0) {

		}
		System.out.println("C不为0");

	}

}

class MyVolatile {
	volatile int c = 0;

	public void add() {
		this.c = 10;
	}
}

}

}

输出结果为:A:10 Mian:C不为0

如果不加volatile关键字 main线程可能会一直在while循环中

打赏
本站所有资源均来源于网络,仅供学习使用,请支持正版!Java技术开源 » volatile与Java内存模型

评论 抢沙发

评论前必须登录!

 

觉得文章有用就打赏一下文章作者

非常感谢你的打赏,我们将继续提供更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫

微信扫一扫

登录

找回密码

注册