本文主要是介绍【并发编程】-01-可见性、原子性、有序性,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
01-可见性、原子性、有序性
源头之一:缓存导致的可见性问题
可见性:一个线程对共享变量的修改,另外一个线程能够立刻看到,我们称为可见性.
源头之二:线程切换带来的原子性问题
例如:count += 1,在cpu指令级别上
- 指令 1:首先,需要把变量 count 从内存加载到 CPU 的寄存器;
- 指令 2:之后,在寄存器中执行 +1 操作;
- 指令 3:最后,将结果写入内存(缓存机制导致可能写入的是 CPU 缓存而不是内存)。
我们把一个或者多个操作在 CPU 执行的过程中不被中断的特性称为原子性。CPU 能保证的原子操作是 CPU 指令级别的,而不是高级语言的操作符。
源头之三:编译优化带来的有序性问题
经典的例子:
public class Singleton {
static Singleton instance;
static Singleton getInstance(){
if (instance == null) {
synchronized(Singleton.class) {
if (instance == null)
instance = new Singleton();
}
}
return instance;
}
}
出现的问题:new 操作上,:
- 分配一块内存 M;
- 在内存 M 上初始化 Singleton 对象;
- 然后 M 的地址赋值给 instance 变量。
但是实际上优化后的执行路径却是这样的:
- 分配一块内存 M;
- 将 M 的地址赋值给 instance 变量;
- 最后在内存 M 上初始化 Singleton 对象。
这篇关于【并发编程】-01-可见性、原子性、有序性的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!