时间:2021-05-19
一、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)
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不会引起阻塞。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
volatile关键字相信了解Java多线程的读者都很清楚它的作用。volatile关键字用于声明简单类型变量,如int、float、boolean等数据类型。
volatile关键字经常用来修饰变量。不过,volatile本身很容易被误用。本篇就介绍一下volatile的原理和使用方式。在介绍volatile关键字原理
前言在Java中,Java中volatile关键字十分重要本文全面&详细解析volatile关键字,希望你们会喜欢目录1.定义Java中的1个关键字/修饰符2.
概述Java语言中关键字volatile被称作轻量级的synchronized,与synchronized相比,volatile编码相对简单且运行的时的开销较少
前言近期看到C++标准中对volatile关键字的定义,发现和java的volatile关键字完全不一样,C++的volatile对并发编程基本没有帮助。网上也