使用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)
上一篇 2021年6月5日 下午1:00
下一篇 2021年6月5日 下午2:00


相关推荐

  • 银行软件测试面试问题_银行外包软件测试如何

    银行软件测试面试问题_银行外包软件测试如何今天参加了一场比较正式的面试,汇丰银行的视频面试。在这里把面试的流程记录一下,结果还不确定,但是面试也是自我学习和成长的过程,所以记录下来大家也可以互相探讨一下。 请你做一下自我介绍?(汇丰要求英文的自我介绍) 使用什么工具来管理项目? 测试用例是怎么管理的?测试用例的协作、更改、不同的版本是怎么管理的? 描述一下最近做的项目,具体做了什么?测试哪些方面?负责什么功能? 对项目中某个功能设计测试用例的时候使用了哪些方法?写了多少条用例? 设计测试用例是

    2022年8月27日
    12
  • Claude 4.1 Opus API完整接入指南:最强编程AI模型实战教程

    Claude 4.1 Opus API完整接入指南:最强编程AI模型实战教程

    2026年3月16日
    2
  • “养龙虾”存安全风险,多所高校禁止在办公电脑上安装

    “养龙虾”存安全风险,多所高校禁止在办公电脑上安装

    2026年3月14日
    2
  • mysql json decode_json_decode函数详解

    mysql json decode_json_decode函数详解json_decode是php5.2.0之后新增的一个PHP内置函数,其作用是对JSON格式的字符串进行编码.那么这个函数该如何使用呢?json_decode的语法规则:json_decode(string$json[,bool$assoc=false[,int$depth=512[,int$options=0]]])json_decode接受一个JSON格…

    2022年7月17日
    45
  • Python的递归函数原理和实例

    Python的递归函数原理和实例递归函数 函数体内调用了该函数本身 分为传递和回归两个过程 组成部分 递归调用和终止条件 优点 思路和代码简单 缺点 占用内存多 效率低下 实例 使用递归来计算 6 的阶乘思路 代码实现 deffunc n ifn 1 return1else returnn func n 1 print func 6 解释 实际上调用过程是 6func 5func 4func 3func 2 func 1 这个过程是传递

    2025年7月31日
    7
  • 计算背板带宽方法

    计算背板带宽方法背板带宽 端口数 端口速率 2 包转发率 接口带宽 bps 8bit 64 8 12 千兆包转发率 1 488Mpps 百兆 0 1488Mpps 万兆 14 88Mpps 例如 2950G 48 背板 2 1000 2 48 100 2 13600Mbps 13 6Gbps 相当于 13 6 2 6 8 个千兆口吞吐量 6 8×1 488 10 1184

    2026年3月17日
    2

发表回复

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

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