- 竞态条件
当多个线程处理同一块内存区域时,有于对共享内存的操作不是原子操作,会造成语句的执行得不到期望的结果
eg:
public class CounterThread extends Thread {
static int count = 0;
static int num = 1000;
@Override
public void run() {
for(int i = 0; i < num; i++){
count++;
}
}
public static void main(String[] args) throws InterruptedException {
Thread[] threads = new CounterThread[num];
for(int i = 0; i < num; i++){
threads[i] = new CounterThread();
threads[i].start();
}
for(int i = 0; i < num; i++){
threads[i].join();
}
System.out.println(count);
}
}
count做为共享变量,所用线程并发执行时操作同一块内存
count++并非原子操作,当执行此语句时分解为三个原子操作
取出count值
为count值加一
为count变量赋值
假设count值为100,有两个线程近乎同时的取出count值,为其加一,然后将其赋值给count变量,此时我们得到的count变量中的值为101而非预期中的102
(2)内存可见性
当cpu操作某个数据后并不一定直接写会内存,而是保存到寄存器或cpu缓存中,此时即使共享变量已改变,其他线程也看不到,因为一旦执行其他线程,cpu则需切换上下文,此时当前线程只能从内存中得到其他线程操作后的数据状态。