这期内容当中小编将会给大家带来有关怎么在java中实现一个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也能保证有序,但是代价大
上述就是小编为大家分享的怎么在java中实现一个volatile关键字了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注亿速云行业资讯频道。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。