文章详情
java中volatile关键字有什么作用(volatile关键字线程安全)
问题:java中volatile关键字有什么作用
在工作的时候,我碰到了volatile关键字。但是我不是非常了解它。我发现了这个解释
这篇文章已经解释了问题中的关键字的细节了,你们曾经用过它吗或者见过正确使用这个关键字的样例
回答
-
Java中同步的实现大多是通过关键字synchronized和volatile和锁
-
在Java里面,我们没有 synchronized 的变量。对一个变量使用 synchronized 关键字是非法的,会导致编译错误的。我们可以使用volatile变量而不是synchronized变量,volatile变量会让JVM里面的线程去主存中读取volatile 变量的值并且不在本地副本里面缓存
-
如果一个变量没有被多个线程共享,那就不需要使用volatile关键字了。
volatile使用的例子:
public class Singleton { private static volatile Singleton _instance; // volatile variable public static Singleton getInstance() { if (_instance == null) { synchronized (Singleton.class) { if (_instance == null) _instance = new Singleton(); } } return _instance; } }
我们在第一次使用的时候才创建这个实例
如果我们没有给这个变量加volatile,那么创建单例的那个线程就没办法和其他线程通信。如果线程A在创建一个单例,在创建完单例以后,cpu炸了,那么其他线程就看不到这个实例了,它们就觉得这个实例还是空的。
为什么会发生这种情况?因为读线程没有加锁,直到写线程来到了同步代码块,内存没有被同步,实例的值还未被刷新到主存里。在 Volatile关键字以后,这就由Java自身处理,这样的更新是对所有的读线程可见的
Conclusion: volatile 关键字也可以用于多个线程在主存的通信
不使用volatile的例子:
publicclassSingleton{privatestaticSingleton _instance;//without volatile variablepublicstaticSingletongetInstance(){if(_instance ==null){synchronized(Singleton.class){if(_instance ==null) _instance =newSingleton(); } }return_instance; }public class Singleton{
private static Singleton _instance; //without volatile variable
public static Singleton getInstance(){
if(_instance == null){
synchronized(Singleton.class){
if(_instance == null) _instance = new Singleton();
}
}
return _instance;
}
上一文章:node.js快速入门(node.js基础教程学习)
下一文章:频繁GC导致CPU飙高问题解决方法
相关推荐
- 10-21巧用可变函数绕过CVE-2020-15148限制
- 05-24TwoTricksOfCAS-CLIENTAUTHBypass
- 10-23谈谈AMF网站的渗透测试
- 10-21一次字符串拼接的sql注入实战
- 05-18weblogic-CVE-2020-14756漏洞分析
- 11-06案例分享:Location302跳转 CRLF场景下如何构
- 11-09思路分享:windows权限维持场景中如何隐藏服
- 10-20懒惰使人进步:探索与发现的思维
- 10-21从报错信息泄露到使用ECS接口执行命令反弹s
- 10-21Windows下常见的内核溢出提权
- 05-11免杀入门混淆加密方法分析,看这一篇就够了。
- 05-24Vulnstack内网靶场渗透记录
- 05-19LightCMS文件上传
- 05-13物联网设备常见的web服务器——uhttpd源码分