java final 可见性_并发编程—如何解决可见性和有序性问题

在上一篇并发编程之BUG源头我们介绍了导致并发编程出现诡异问题的三大源头,即:缓存导致了可见性问题,线程切换带来了原子性问题,编译优带来了有序性问题,这三个Bug源头在所有的编程语言中都会遇到,那么今天就聊聊 Java是通过什么技术解决的。

Java中解决可见性和有序性问题的主角当属 Java内存模型了。说到Java内存模型,在很多面试中都会问到,是一个热门考点,也是一个程序员并发水平的具体体现。只有掌握了Java内存模型,才能在解决问题时慧眼如炬。

什么是Java内存模型

我们知道,导致可见性的原因是缓存,导致有序性的原因是指令重排序,那么解决可见性、有序性对直接的办法就是禁用缓存和指令重排序,但是如果解决了这些问题,可能又会引发性能问题。那么合理的方案就是按需禁用缓存和编译优化。如何才能做到“按需禁用”呢?由于并发程序也是程序员写的,程序员是知道程序该怎么运行才是正确的。所以,为了解决可见性和有序性,只要提供给程序员按需禁用缓存和编译优化的方法即可。Java内存模型就是规范了JVM如何提供按需禁用缓存和编译优化的方法。Java中提供的方法包括 volatile、synchronized和final 三个关键字,以及六项 Happens-Before规则。接下来就介绍以下这几种方法

一、volatile

1、volatile内存写-读的内存语义

** volatile写的内存语义:**

当写一个volatile变量是,JMM会把该线程对应的CPU缓存中的共享变量值刷新到主内存中。

** volatile读的内存语义:**

当读一个volatile变量时,JMM会把该线程对应的CPU缓存中的值值为无效

你可能感兴趣的:(java,final,可见性)