使用volatile关键字的场景

使用volatile关键字的场景

五.使用volatile关键字的场景

synchronized关键字是防止多个线程同时执行一段代码,那么就会很影响程序执行效率,而volatile关键字在某些情况下性能要优于synchronized,但是要注意volatile关键字是无法替代synchronized关键字的,因为volatile关键字无法保证操作的原子性。通常来说,使用volatile必须具备以下2个条件:

1)对变量的写操作不依赖于当前值

2)该变量没有包含在具有其他变量的不变式中

实际上,这些条件表明,可以被写入 volatile 变量的这些有效值独立于任何程序的状态,包括变量的当前状态。

事实上,我的理解就是上面的2个条件需要保证操作是原子性操作,才能保证使用volatile关键字的程序在并发时能够正确执行。

下面列举几个Java中使用volatile的几个场景。

1.状态标记量

1
2
3
4
5
6
7
8
9
volatile
boolean
flag =
false
;
 
while
(!flag){
    
doSomething();
}
 
public
void
setFlag() {
    
flag =
true
;
}

1
2
3
4
5
6
7
8
9
10
volatile
boolean
inited =
false
;
//线程1:
context = loadContext(); 
inited =
true
;           
 
//线程2:
while
(!inited ){
sleep()
}
doSomethingwithconfig(context);

 

2.double check

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class
Singleton{
    
private
volatile
static
Singleton instance =
null
;
 
    
private
Singleton() {
 
    
}
 
    
public
static
Singleton getInstance() {
        
if
(instance==
null
) {
            
synchronized
(Singleton.
class
) {
                
if
(instance==
null
)
                    
instance =
new
Singleton();
            
}
        
}
        
return
instance;
    
}

转载于:https://www.cnblogs.com/yfafa/p/9076927.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/101649.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • SpringBoot——SpringBoot整合Mybatis

    SpringBoot——SpringBoot整合MybatisSpringBoot——SpringBoot整合Mybatis

    2022年4月23日
    47
  • 判断图同构大杀器—nauty算法

    判断两图是否同构是一个经典问题。nauty算法作为时下较为流行的主流算法,具有效率高,剪枝力度强等优势。当然,在某些特殊情况会失灵。虽然该算法的概念在上世纪80年代就提出来了,但发展至今,仍然是不可忽略的一种方法。本人翻遍了中文互联网,没找到详细相关介绍,在stackoverflow上边找到了一个问答,顺着帖子的回复找到了算法原作者自建的网站,如获至宝。再结合离散数学,看懂了这个算法的大致流程。总结如下:nauty算法:判断两个图是否同构。思路:①设置一套编号系统,给两个图进行编号,如果两个

    2022年4月8日
    35
  • Alex 的 Hadoop 菜鸟教程: 第4课 Hadoop 安装教程 – HA方式 (2台服务器)

    Alex 的 Hadoop 菜鸟教程: 第4课 Hadoop 安装教程 – HA方式 (2台服务器)具体的讲解一下如何将hadoop安装成HA模式

    2022年6月4日
    27
  • sin的傅里叶变换公式_傅里叶变换的由来及复数下的傅里叶变换公式证明

    sin的傅里叶变换公式_傅里叶变换的由来及复数下的傅里叶变换公式证明1、考虑到一个函数可以展开成一个多项式的和,可惜多项式并不能直观的表示周期函数,由于正余弦函数是周期函数,可以考虑任意一个周期函数能否表示成为一系列正余弦函数的和。假设可以,不失一般性,于是得到:f(t)=A0+∑(n=1,∞)Ansin(nωt+Φn)2、将后面的正弦函数展开:Ansin(nωt+Φn)=AnsinΦncosnωt+AncosΦnsinnωt令a0/2=A0,an…

    2022年7月17日
    17
  • Linux安装Jenkins教程

    Linux安装Jenkins教程Linux安装Jenkins教程网址https://pkg.jenkins.io/redhat-stable/选择最新的版本下载下载好了将文件上传到服务器然后执行命令rpm-ivhjenkins-2.7.3-1.1.noarch.rpm(版本自己对应上!!这里我只是举例)Jenkins默认的端口是8080,如果你的tomcat也是,那你得修改下进入vi/etc/sysc…

    2022年5月14日
    34
  • xray漏洞扫描器

    xray漏洞扫描器文章目录一、xray下载二、xray安装、使用一、xray下载xray是一款功能强大的安全评估工具,由多名经验丰富的一线安全从业者呕心打造而成,主要特性有:1、检测速度快。发包速度快;漏洞检测算法高效。2、支持范围广。大至OWASPTop10通用漏洞检测,小至各种CMS框架POC,均可以支持。3、代码质量高。编写代码的人员素质高,通过CodeReview、单元测试、集成测试等多层验证来提高代码可靠性。4、高级可定制。通过配置文件暴露了引擎的各种参数,通过修改配置文件可

    2022年5月7日
    87

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号