第二讲-解决可见性、有序性问题
引出问题:
导致可见性原因是缓存,导致有序性原因是编译优化,那我们可能想到,禁用缓存和编译优化,这两个问题不就解决了吗?
可是缓存和编译优化的提出是为了提高性能,如果禁用,程序的性能就堪忧了;
合理方案:
按需禁用缓存以及编译优化;然而,java内存模型规范了jvm如何提供按需禁用缓存和编译优化的方法,具体来说,就是三
个关键字(volatile、synchronize、final),六项Happens-Before规则;
Happens-Before规则:
含义:前面一个操作的结果对后续操作是可见的;
1)程序的顺序性规则
2)volatile变量规则
3)传递性
4)管程中锁的规则
5)线程start()规则
6)线程join()规则