多线程有三个必须要保证的特性,才能正常运行(三个特性是:有序性,可见性,原子性)JMM的作用就是保证这三个特征

有序性的原因,和保证措施(as-if-serial)

  1. JVM执行代码时,可能会优化编译器和优化CPU的性能发挥,所以会进行对 代码顺序调整。当然,此顺序会保证as-if-serial(也就是再怎么优化顺序,单线程最终的结果不变。但是,多线程下,如果把代码顺序改变,可能会造成结果不同)
    多线程有三个必须要保证的特性,才能正常运行(三个特性是:有序性,可见性,原子性)JMM的作用就是保证这三个特征_第1张图片
    多线程有三个必须要保证的特性,才能正常运行(三个特性是:有序性,可见性,原子性)JMM的作用就是保证这三个特征_第2张图片
    所以当多线程下,必须考虑是否要保证代码有序性!用volatile保证

可见性的原因:

由于CPU和内存的速度不同,所以要在他们中间加了一个缓存保证效率。
但是呢多个缓存之间可能存在缓存的数据不一致,这就是可见性

原子性

一个操作不能被打断,要么全部执行完毕,要么不执行。在这点上有点类似于事务操作,要么全部执行成功,要么回退到执行该操作之前的状态。

基本类型数据的访问大都是原子操作,long 和double类型的变量是64位,但是在32位JVM中,32位的JVM会将64位数据的读写操作分为2次32位的读写操作来进行,这就导致了long、double类型的变量在32位虚拟机中是非原子操作,数据有可能会被破坏,也就意味着多个线程在并发访问的时候是线程非安全的。

还有例子
read load write三个操作必须顺序执行,不能中断

JMM定义了工作内存和主内存交互的规则,以保证三个特征

多线程有三个必须要保证的特性,才能正常运行(三个特性是:有序性,可见性,原子性)JMM的作用就是保证这三个特征_第3张图片

你可能感兴趣的:(日记,实习)