Atomicity(原子性),visibility(可被观察性),volatility(挥发性)

一、Atomicity(原子性)
定义:atomic操作是指一个不会被thread scheduler打断的操作
箴言:
1.除非你是多线程【专家】,否则不要使用atomicity来代替synchronization
2.有时候,即使一些操作看上去是atomicity,但实际上它可能并不是
3.任何对去掉synchronization的尝试,通常是不成熟优化的信号,并带来许多
麻烦
应用:
1.atomicity只能应用于除了long, double以外的基本数据类型
2.然而使用volatile关键字定义long, double变量,可以获得atomicity(用于赋值和返回的时候)

 

二、visibility(可被观察性)
定义:一个CPU上对某一个内存区域的操作,可以被另外一个CPU看到。
说明:通常CPU在对某一内存段进行操作前,会将这个内存段拷贝到register(寄存器)中,在register
中对这个内存段进行操作,操作完成后,CPU未必会将register中的数据更新到内存中,因为这个
数据可能还会被读写,而且寄存器的速度要比内存快得多。这样就省下了来回复制的次数,提高了
效率。但是这一优化在多CPU(包括多核)PC架构中会出现问题。
比如:当CPU#1对要对变量A进行操作,CPU#1把内存中的A拷贝到自己的register中,在register中对
A进行修改,这个时候,CPU#2要方问变量A,同样CPU#2也把内存中的A拷贝到自己的register中,注意
这时内存中的A还是原来的样子,因为CPU#1并没有把register中的A更新到内存中,所以实际上CPU#2
获得的是“过时”的A。也就是说,这种情况是一个“不可被观察到的操作”。
解决:synchronization强制保证了多CPU系统中的“可被观察性”

 

三、volatility(挥发性)
说明:volatile关键词同样保证了visibility。如果你声明一个变量为volatile,那么只要有对
这个变量进行的写操作,那么所有对它的读操作都可以看到该变量的变化。
注意:atomicity和volatility是不同的概念。如果对一个非volatility变量进行atomic操作,
那么其他线程不一定能看到该变量的变化。
箴言:
1.如果多个线程访问一个变量,则该变量要么应该是volatile的,要么就应该针对该变量
进行synchronization保护。所以对一个方法声明称synchronized和对一个变量声明volatile
效果是一样的。
2.一个线程可以看到自己对自己变量的修改,因此如果一个变量只被一个线程访问,则没有必要
声明称volatile
3.volatile会失效,当一个变量依赖于它自己先前的状态时(比如自增),当几个变量受到其他变量
的约束时。
4.典型的情况是:当一个类中只有一个可变成员时(非final),对这个成员使用volatile才是安全的
5.你的第一选择应当是synchronize关键词,使用其他方法会有风险

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值