http://www.importnew.com/18126.html
volatile https://www.jianshu.com/p/f74044782927
https://www.cnblogs.com/bangiao/p/13195668.html
概念:java程序的每一个指令都是在cpu上执行的,但是临时数据都是在存储是内存中的(运行内存RAM),但是cpu的执行速度要远远快于读写内存的速度,这样会造成效率低,所以为了解决这个问题,产生一个cpu高速缓冲区,每次从主存中读取一份数据,然后在运算的时候直接从缓存中读取,当运算结束后在刷到主存中去。
多线程问题是指的线程之间共享的变量。
例如:i=i+1; 这个例子在多线程中会出现线程安全问题,两个线程同时读i,然后分别写入到主存中。
解决办法:1,加锁机制 2,通过缓存一致性协议
缓存一致性协议:它核心的思想是:当CPU写数据时,如果发现操作的变量是共享变量,即在其他CPU中也存在该变量的副本,会发出信号通知其他CPU将该变量的缓存行置为无效状态,因此当其他CPU需要读取这个变量时,发现自己缓存中缓存该变量的缓存行是无效的,那么它就会从内存重新读取。
并发编程的三个概念:原子性,可见性,有序性
原子性:一个或多个操作要么全部成功执行,要么全部不执行
可见性:是指当多个线程访问同一个变量时,一个线程改变此变量的值,其它线程立即可见新的值(volatile可保证可见性,因为被修饰后会立即更新到主存中去)
有序性:程序执行的顺序按照代码的先后顺序执行(指的是jvm执行指令的时候可能会发生指令重排序)
下面解释一下什么是指令重排序,一般来说,处理器为了提高程序运行效率,可能会对输入代码进行优化,它不保证程序中各个语句的执行先后顺序同代码中的顺序一致,但是它会保证程序最终执行结果和代码顺序执行的结果是一致的。但是如果有依赖性的话,顺序就不会改变了
happens-before:先行发生原则