美文网首页
java内存模型

java内存模型

作者: 今天不想掉头发 | 来源:发表于2019-07-22 21:54 被阅读0次

    转自:
    http://ifeve.com/java-memory-model-6/
    https://www.hollischuang.com/archives/2550

    物理计算机有一个内存模型,而java虚拟机实际上就是一个抽象的计算机,因此它也有自己的内存模型,称之为Java内存模型。Java内存模型规定了如何和何时可以看到由其他线程修改过后的共享变量的值,以及在必须时如何同步的访问共享变量。

    多核CPU多线程的执行情况下,由于各核有自己的核心,因此每个核的cache中都会保留一份共享内存的缓存数据,而多核是可以并行的,因此可能会出现多个线程同时写各自缓存的情况,各自的cache之间的数据就有可能不同。

    因此,多线程情况下可能会出现缓存一致性问题。

    除此之外,还有一种硬件问题比较重要,CPU为了能够提高流水线的并行度,或者为了运算单元能够被充分利用,可能会对执行的指令进行乱序执行,即处理器乱序执行;并且一些编译器为了提升效率,也会对代码进行重排序,即指令重排序。在单核情况下处理器乱序执行和指令重排序可以通过串行寓意来保证程序的正确执行,但是在多核多线程情况下,就需要采取一些手段来保证程序的正确性了。

    针对上述一系列问题,为了保证多线程情况下程序的正确执行,抽象成了相关的三个问题:原子性、有序性、可见性。

    对不不同的机器类型,需要针对特定的机器类型采取手段来保证原子性、有序性和可见性;而java虚拟机本身就具有跨平台的特性,可以根据不同的机器类型做出不同的实现,因此java内存模型实际上是站在更高一级的角度上对各种不同类型的机器的内存模型进行的更进一步的抽象,对于程序员来说,只要能保证你的代码能够满足java内存模型下的原子性、有序性和可见性,java虚拟机会帮助你保证特定物理机器上三大特性的保证

    而java内存模型也会通过一些手段来保证部分的原子性、有序性和可见性(比如happens-before原则,8大原子操作等),除此之外,就需要程序员通过特定的关键字(比如volatile和synchronized等)来保证了。

    对于可见性原子性:通过synchronized来保证方法和代码块的操作是原子性的
    对于可见性:通过volatile关键字来保证多线程操作时变量的可见性
    对于有序性:通过synchronized或者volatile保证有序性

    相关文章

      网友评论

          本文标题:java内存模型

          本文链接:https://www.haomeiwen.com/subject/dzuglctx.html