java中volatile关键字的含义
来源:互联网 发布:淘宝好评卡片 编辑:程序博客网 时间:2024/06/05 17:50
volatile 关键字作用是,使系统中所有线程对该关键字修饰的变量共享可见,可以禁止线程的工作内存对volatile修饰的变量进行缓存。
volatile 2个使用场景:
1.可见性:Java提供了volatile关键字来保证可见性。
当一个共享变量被volatile修饰时,它会保证修改的值会立即被更新到主存,当有其他线程需要读取时,它会去内存中读取新值。
而普通的共享变量不能保证可见性,因为普通共享变量被修改之后,什么时候被写入主存是不确定的,当其他线程去读取时,此时内存中可能还是原来的旧值,因此无法保证可见性。
另外,通过synchronized和Lock也能够保证可见性,synchronized和Lock能保证同一时刻只有一个线程获取锁然后执行同步代码,并且在释放锁之前会将对变量的修改刷新到主存当中。因此可以保证可见性。
先看一段代码,假如线程1先执行,线程2后执行:
//线程1boolean stop = false; while(!stop){ doSomething(); } //线程2 stop = true;
这段代码是很典型的一段代码,很多人在中断线程时可能都会采用这种标记办法。但是事实上,这段代码会完全运行正确么?即一定会将线程中断么?不一定,也许在大多数时候,这个代码能够把线程中断,但是也有可能会导致无法中断线程(虽然这个可能性很小,但是只要一旦发生这种情况就会造成死循环了)。
下面解释一下这段代码为何有可能导致无法中断线程。在前面已经解释过,每个线程在运行过程中都有自己的工作内存,那么线程1在运行的时候,会将stop变量的值拷贝一份放在自己的工作内存当中。
那么当线程2更改了stop变量的值之后,但是还没来得及写入主存当中,线程2转去做其他事情了,那么线程1由于不知道线程2对stop变量的更改,因此还会一直循环下去。
但是用volatile修饰之后就变得不一样了:
第一:使用volatile关键字会强制将修改的值立即写入主存;
第二:使用volatile关键字的话,当线程2进行修改时,会导致线程1的工作内存中缓存变量stop的缓存行无效(反映到硬件层的话,就是CPU的L1或者L2缓存中对应的缓存行无效);
第三:由于线程1的工作内存中缓存变量stop的缓存行无效,所以线程1再次读取变量stop的值时会去主存读取。
那么在线程2修改stop值时(当然这里包括2个操作,修改线程2工作内存中的值,然后将修改后的值写入内存),会使得线程1的工作内存中缓存变量stop的缓存行无效,然后线程1读取时,发现自己的缓存行无效,它会等待缓存行对应的主存地址被更新之后,然后去对应的主存读取最新的值。
那么线程1读取到的就是最新的正确的值。
2.保证有序性
volatile boolean inited = false; //线程1: context = loadContext(); inited = true; //线程2: while(!inited ){ sleep() }doSomethingwithconfig(context);
确保context已经初始化完成。
3.double check
package singleton;//懒汉式单例模式public class MySingleton3 { //设立静态变量 private static volatile MySingleton3 mySingleton = null; //私有化构造函数 private MySingleton3(){ System.out.println("懒汉式单例模式调用构造函数"); } //开放一个公有的方法,判断是否已经存在实例,有就返回,没有则新建一个再返回 public static MySingleton3 getInstance(){ System.out.println("懒汉式单例模式开始调用公有的方法返回实例"); if(mySingleton==null){ synchronized (MySingleton3.class) { if(mySingleton==null){ mySingleton = new MySingleton3(); } } } System.out.println("方法调用结束,返回单例"); return mySingleton; }}
- java中volatile关键字的含义
- java中volatile关键字的含义
- java中volatile关键字的含义
- java中volatile关键字的含义
- java中volatile关键字的含义
- java中Volatile关键字的含义
- java中volatile关键字的含义
- java中volatile关键字的含义
- java中volatile关键字的含义
- java中volatile关键字的含义
- java中volatile关键字的含义
- java中volatile关键字的含义
- java 中 volatile 关键字 的含义
- java中volatile关键字的含义
- java中volatile关键字的含义
- java中volatile关键字的含义
- java中volatile关键字的含义
- java中volatile关键字的含义
- 图片压缩上传
- 网络编程步骤
- 【脚本语言系列】关于Python异常处理,你需要知道的事
- codeforces 814A
- 2016百度-罪犯转移-Java
- java中volatile关键字的含义
- R语言使用merge函数匹配数据(vlookup,join)
- 漫谈Java理念的转变与JVM的五大优势
- 《演讲的力量》读书笔记
- keras系列︱迁移学习:利用InceptionV3进行fine-tuning及预测、完美案例(五)
- 逆向基础笔记
- Vuforia开发入门(二):资源介绍
- 总述
- 如何消除人的惰性