一、并发编程的三大问题
1、原子性问题
2、可见性问题
3、有序性问题
1、原子性问题
所谓原子操作,就是“不可中断的一个或一系列操作”,是指不会被线程调度机制打断的操作
class CounterSample
{
int sum = 0;
public void increase() {
sum++; //①
}
}
上述代码经过 javap命令进行反编译解析出的汇编代码
public void increase();
Code:
0: aload_0
1: dup
2: getfield #2 // Field sum:I ① 获取当前sum变量,并放入栈顶(操作数栈)
5: iconst_1 ② 将常量1放入栈顶
6: iadd ③ 将当前栈顶的两个数 sum和1相加,并把结果放入栈顶
7: putfield #2 // Field sum:I ④ 把栈顶的结果再赋值给 sum变量
10: return
通过上述反编译解析的结果来看,++操作实质进行了4个操作,在4个操作之间,是可以发生进程切换,而被其他线程打断。所以++操作不具有原子性(在并发场景下)。
2、可见性问题
一个线程对共享变量的修改,另外一个线程能够立刻可见,我们可以称该共享变量具备内存可见性。关于可见性问题有必要谈谈JMM(Java内存模型)。
JMM规定,将所有的变量都存放在公共主存中,当线程使用变量时,会把主存里面的变量复制到自己的工作空间(又称为私有内存),线程对变量的读写操作,