1、多线程编程的三个核心概念
1.原子性:提供互斥访问,同一时刻只能有一个线程对数据进行操作,(atomic,synchronized);
2.可见性:一个线程对主内存的修改可以及时地被其他线程看到,(synchronized,volatile);
3.有序性:一个线程观察其他线程中的指令执行顺序,由于指令重排序,该观察结果一般杂乱无序,(happens-before原则)。
原子性:类比数据库事务的原子性;即一个操作,也有可能是一组操作,要么全部生效,要么全部失效
可见性: 当多个线程并发访问共享变量时,一个线程对共享变量的修改,其它线程能够立即看到, CPU从主内存中读数据的效率相对来说不高,现在主流的计算机中,都有几级缓存。每个线程读取共享变量时,都会将该变量加载进其对应CPU的高速缓存里,修改该变量后,CPU会立即更新该缓存,但并不一定会立即将其写回主内存(实际上写回主内存的时间不可预期)。此时其它线程(尤其是不在同一个CPU上执行的线程)访问该变量时,从主内存中读到的就是旧的数据,而非第一个线程更新后的数据。这一点是操作系统或者说是硬件层面的机制
顺序性 :程序执行的顺序按照代码的先后顺序执行。如下面这段代码
1 boolean started = false; 2 long counter = 0L; 3 counter = 1; 4 started = true;
从代码顺序上看,上面这4条语句应该一次执行,但实际上JAVA 虚拟机真正执行这段代码时&#