JMM(java内存模型) 描述Java程序中各种内存(线程共享变量)的访问规则。所有变量都存在于主内存中,每个线程都有自己独立的工作内存,线程间不可以直接互相操作其工作内存中的变量,以及主内存的变量,只能以主内存为媒介做改变。
多线程的可见性实现有两种方式:(其实finally也算一种)
1,通过synchronized实现,synchronized(属性的意思:1,给线程加锁2,实现可见性)
synchronize是通过:获取互斥锁->清空工作区内存->从主内存copy值到工作内存->执行代码->把值放回主内存->释放互斥锁
重排序的概念:编译器或者处理器为了提高程序性能而对代码编译时进行重新的排序,可能会导致代码真正的执行顺序与书写顺序不一样。
as-if-serial 的意思是在单线程下无论程序怎样重排序其执行结果永远一致,故不会带来内存可见性问题, 多线程可能不遵循此定律,所以可能导致内存可见性问题。
2,通过volatile关键字实现:(1,实现可见性,但不可以实现原子性)
volatile是通过加入内存屏障和禁止重排序实现可见性的。比如写操作之后的store屏障命令和读操作之前的load屏障命令。
store是在写之后强制把工作内存的值刷新到主内存,(其中是用清空工作内存的值才來实现重新取值的)load相反先从主内存取到值到工作内存,然后再读。
如何实现原子性:加锁eg, synchronize或者 reentranlock