面试官:讲讲happens-before
happens-before是判断数据是否存在竞争、线程是否安全的重要依据
JMM的自我介绍
Hello 大家好,我原名叫Java Memory Model(Java 内存模型),大家都叫我JMM,简洁又好听,我挺喜欢。
并发编程这块,没有我可是不行的,我要解决的问题就是一个线程对共享变量的写入何时对另一个线程可见
比如一个线程给 变量 a 赋值
a = 3; // 往变量 a 写值
我要解决的问题就是:“在什么条件下,读取变量 a 的线程将看到这个值 3”
如果缺少同步,那会有很多因素使得 读取变量 a 的线程不能立即看到或者永远看不到这个值 3
在我的世界里,所有的变量都存储在主内存中,每一个线程都有一个私有的本地内存,本地内存中存储了该线程使用到的变量在主内存中拷贝
线程对变量的所有操作(读取、赋值等)都必须在工作内存中进行,而不能直接读写主内存中的变量(volatile变量也不例外),如下图