Java中volatile关键字是如何实现可见性和有序性的原理是什么?

2026-06-10 14:481阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计580个文字,预计阅读时间需要3分钟。

Java中volatile关键字是如何实现可见性和有序性的原理是什么?

一、volatile关键字的意义分析

1.保证可见性:对共享变量的修改,其他线程能够立即知道。

2.保证有序性:防止指令重排,确保操作的顺序执行。

3.volatile的原理和实现机制:有volatile修饰的共享变量,每次读写都会直接操作主存,不依赖于缓存。

二、volatile的关键特性

1.不能保证原子性(如i++操作)。

2.保证有序性。

3.保证可见性。

一、volatile关键字的语义分析

1.保证可见性

对共享变量的修改,其他线程能够马上感知到。但不能保证原子性(i++)

2.保证有序性

3.volatile的原理和实现机制

有volatile修饰的共享变量进行写操作的时候会多出有 “lock”标志的汇编代码,Lock前缀的指令在多核处理器下会引发两件事情:

1)将当前处理器缓存行中的数据写回到系统内存中

2)这个写回内存的操作会使在其他cpu里缓存了该内存地址的数据无效。

二、volatile的使用场景

1.状态标志(开关模式)  

package com.roy.http; public class ShutDownDemmo extends Thread{ private volatile boolean state = false; @Override public void run() { while(state){ System.out.println("我在做工作"); } } public void shutDown(){ state = false; } }

当调用shutDown方法时,里面只有一个赋值操作,所以它是原子性的,同时state字段是volatile的,所以当值发生变化时其它线程会立即察觉到。

2.双重检查锁定(double-checked-locking)

Java中volatile关键字是如何实现可见性和有序性的原理是什么?

package com.roy.http; public class Singleton { private volatile static Singleton instance; public static Singleton getInstance(){ if (instance==null) { synchronized (Singleton.class) { instance = new Singleton(); } } return instance; } }

单例模式中使用双重检查锁定。

三、volatile和synchronized的区别

1.使用上的区别

volatile只能修饰变量,而synchronized只能修饰方法和语句块。

2.对原子性的保证

volatile不能保证原子性,synchronized保证了原子性。

3.对可见性的保证

两者都能保证可见性,但实现原理不同

volatile对变量添加了lock,synchronized使用monitorenter和monitorexit。

4.对有序性的保证

volatile能保证有序,synchronized也能保证有序,但是代价大

5.其他

synchronized会引起阻塞,volatile不会引起阻塞。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持自由互联。

标签:

本文共计580个文字,预计阅读时间需要3分钟。

Java中volatile关键字是如何实现可见性和有序性的原理是什么?

一、volatile关键字的意义分析

1.保证可见性:对共享变量的修改,其他线程能够立即知道。

2.保证有序性:防止指令重排,确保操作的顺序执行。

3.volatile的原理和实现机制:有volatile修饰的共享变量,每次读写都会直接操作主存,不依赖于缓存。

二、volatile的关键特性

1.不能保证原子性(如i++操作)。

2.保证有序性。

3.保证可见性。

一、volatile关键字的语义分析

1.保证可见性

对共享变量的修改,其他线程能够马上感知到。但不能保证原子性(i++)

2.保证有序性

3.volatile的原理和实现机制

有volatile修饰的共享变量进行写操作的时候会多出有 “lock”标志的汇编代码,Lock前缀的指令在多核处理器下会引发两件事情:

1)将当前处理器缓存行中的数据写回到系统内存中

2)这个写回内存的操作会使在其他cpu里缓存了该内存地址的数据无效。

二、volatile的使用场景

1.状态标志(开关模式)  

package com.roy.http; public class ShutDownDemmo extends Thread{ private volatile boolean state = false; @Override public void run() { while(state){ System.out.println("我在做工作"); } } public void shutDown(){ state = false; } }

当调用shutDown方法时,里面只有一个赋值操作,所以它是原子性的,同时state字段是volatile的,所以当值发生变化时其它线程会立即察觉到。

2.双重检查锁定(double-checked-locking)

Java中volatile关键字是如何实现可见性和有序性的原理是什么?

package com.roy.http; public class Singleton { private volatile static Singleton instance; public static Singleton getInstance(){ if (instance==null) { synchronized (Singleton.class) { instance = new Singleton(); } } return instance; } }

单例模式中使用双重检查锁定。

三、volatile和synchronized的区别

1.使用上的区别

volatile只能修饰变量,而synchronized只能修饰方法和语句块。

2.对原子性的保证

volatile不能保证原子性,synchronized保证了原子性。

3.对可见性的保证

两者都能保证可见性,但实现原理不同

volatile对变量添加了lock,synchronized使用monitorenter和monitorexit。

4.对有序性的保证

volatile能保证有序,synchronized也能保证有序,但是代价大

5.其他

synchronized会引起阻塞,volatile不会引起阻塞。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持自由互联。

标签: