线程相关的笔记
java并发问题的三要素
可见性
//线程1执行的代码
int i= 0;
i=10;
//线程2执行的代码
j=i;
当线程1执行i赋值操作时是先在内存中,然后才会写入主存,此时,线程2会在主存中读取i的值,但线程1没有写到主存,所以读取到的值是i=0,这就是可见性问题。
原子性
就是一组操作,要么全部执行,要么全部都不执行。
int i= 0;
//线程1
i+=1;
//线程2
i+=1;
i+=1,执行顺序是,把变量i从内存读取到cpu寄存器进行运算,cpu执行i+1操作,将结果写入内存。由于cpu线程切换的操作,线程2在线程1执行第一步就抢占资源先执行了,然后就回到线程1执行后续步骤,就会导致写入内存的是2。
有序性:指令重排
就是在程序运行的时候,并没有按照人为安排的顺序来执行,为了提高性能,内部进行了指令重排的操作,像有编译器优化的重排序、指令级并行的重排序,内存系统的重排序。