-
学习上篇文章知道,可见性是由缓存导致的,有序性是由编译优化导致的。禁用缓存和编译优化,也就解决了这两个问题。然而设置缓存和编译优化的目的是为了提供性能,直接禁用缓存和编译优化显然是不可行的;
-
故而需要按需缓存和编译优化。JAVA内存模型本质就是提供了程序员按需缓存和编译优化的方法。这些方法具体为synchronized、final、volatile和6个happens before规则;
-
volatile
volatile int v = false;
int x = 20;
void write(){
x= 42;
v = true;
}
void read(){
if(v == true){
}
}
-
happen before规则,一个操作的结果对后一个操作是可见的。
- 在一个线程中,前一个操作的结果对后一个操作可见;
- 对volatile修饰的变量,对该变量写的操作happens before后续对该变量读的操作;
- 假如A happens before B,B happens before C,则A happens before C;
- 线程的释放锁 happens before 线程的获得该锁。
- start(),有线程A和线程B,在A调用B.start(),调用前A中所有的操作对线程B可见
- join(),有线程A和线程B,在A调用B.join(),线程B中的所有操作,对B.join()后的操作可见
-
final关键字:待补充
-
好的评论: