现在的位置: 首页 > 综合 > 正文

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

2019年11月23日 ⁄ 综合 ⁄ 共 1248字 ⁄ 字号 评论关闭

  一、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关键词,使用其他方法会有风险

抱歉!评论已关闭.