volatile,synchronized和Lock
相关特点:
可见性(visibility):一个线程对于共享变量做了修改之后,其他的线程立即能够看到(感知到)该变量的修改。
Java内存模型是通过将工作区内存中的变量修改后的值同步到主内存中,在读取变量前从主内存刷新最新的值到工作内存中,这种依赖主内存的方式来实现可见性。
原子性(atomicity):一次操作不能被打断,要么全部执行,要么都不执行。
有序性:在本线程中观察,操作都是有序的;如果在另外一个线程中观察本线程,所有的操作都是无序的。
Java内存模型保证的是,同线程内,所有的操作都是由上到下的,但是多个线程并行的情况下,则不能保证操作的有序性。计算机在执行程序时,为了提高性能,编译器常常会对指令进行重排。通常先是编译器优化重排,再是指令并行重排,再是内存系统重排,最终成为实行指令。
在单线程环境里面确保程序最终运行结果和代码执行结果一致,处理器在进行重排时必须考虑到指令之间的数据依赖性。
在多线程环境中线程交替执行,由于编译器优化重排的存在,多个线程使用的变量能否保证变量一致是无法确定的,结果是无法预测的。
线程安全性保证
常见的线程安全问题:工作内存与主内存同步延时现象导致数据可见性问题。
当一个变量在两个线程中操作时,当一个线程正