-
学习上篇文章知道,可见性是由缓存导致的,有序性是由编译优化导致的。禁用缓存和编译优化,也就解决了这两个问题。然而设置缓存和编译优化的目的是为了提供性能,直接禁用缓存和编译优化显然是不可行的;
-
故而需要按需缓存和编译优化。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关键字:待补充
-
好的评论:

本文深入探讨了Java内存模型的本质,即如何通过synchronized、final、volatile关键字及happens-before规则来实现线程间的可见性和有序性。文章详细解释了volatile的作用机制,以及happens-before原则在确保操作顺序中的应用。
690

被折叠的 条评论
为什么被折叠?



