java内存模型JMM
线程安全的几个概念
1. 原子性(atomicity)
一个操作,不可分割,要么完成,要么失败。比如:int i = 0
是原子性操作,而i=i+1
不是原子性操作,因为需要先计算i+1
,然后再赋值给i
,如果多个线程同时操作,最终i
的值是不确定的。
2. 可见性(visibility)
多线程操作共享数据时,每个线程会把值读入自己的线程内存中,如果有线程修改了值,也可能只在自己内存中修改了值,其它线程是察觉不到的,造成各个线程操作的值不一致。
3. 有序性(ordering)
程序在执行时可能会进行指令重排序,指令重排序可以保证语义的一致,最终结果不会改变,但是不会保证多线程间语义的一致
public void test1(){
a = 1;
flag = true;
}
public void test2(){
if(flag){
a = a + 1;
}
}
test1
指令重排序可能是
public void test1(){
flag = true;
a = 1;
}
对于test1来说,语义是没有变化的,但是如果两个线程同时执行test1
和test2
那test2
的结果是不确定的。