美文网首页
Java内存模型

Java内存模型

作者: hcq0514 | 来源:发表于2019-08-14 19:07 被阅读0次
    内存模型图
    1. 主内存:java虚拟机规定所有的变量(不是程序中的变量)都必须在主内存中产生,为了方便理解,可以认为是堆区。可以与前面说的物理机的主内存相比,只不过物理机的主内存是整个机器的内存,而虚拟机的主内存是虚拟机内存中的一部分。
    2. 工作内存:java虚拟机中每个线程都有自己的工作内存,该内存是线程私有的,为了理解方便可以认为是虚拟机栈。
      工作内存与CPU的高速缓存区类似。线程的工作内存保存了线程需要的变量在主内存中的副本。
      虚拟机规定,线程对主内存变量的修改必须在线程的工作内存中进行,不能直接读写主内存中的变量。不同的线程之间也不能相互访问对方的工作内存。如果线程之间需要传递变量的值,必须通过主内存来作为中介进行传递。

    JMM抽象模型中的原子性操作

    在JMM抽象模型中定义了8中原子操作。

    1. lock(锁定):作用于主内存中的变量,将某个变量标识为某个线程的独占状态。

    2. unlock(解锁):作用于主内存中的变量,将某个变量从某个线程的独占状态释放出来,可以被其他线程锁定。

    3. read(读取):将主存中的变量从主存中读取到线程的工作内存中,供load操作使用。

    4. load(载入):作用于线程工作内存,将read从主存读取的变量,保存到工作内存的变量副本。

    5. use(使用):作用于工作内存中的变量,当虚拟机执行到需要变量的字节码时,就会需要该动作。

    6. assign(赋值):作用于工作内存中的变量,当虚拟机执行变量的赋值字节码时,将执行该操作,将值赋值给工作内存中的变量。

    7. store(存储):作用与工作内存中的变量,将工作内存的变量传递给主存。

    8. write(写入):作用于主存的变量,将store步骤中传递过来的变量,写入到主存中。

    以上8种操作都是原子性的,JMM内存模型只保证了操作执行的顺序性,但是不保证操作的连续性。

    多线程三大性质(volatile,synchronized见其他博客)

    由于每个线程都会把主内存的数据保存一份副本到自己的工作内存中,
    所以就会出现A,B线程同事访问X值,A线程修改了X值为X+1,B线程对此是不可见的,假设B线程也修改了X值为X+1(假设两个线程同时执行),结果却是X+1

    1. 原子性
      一个操作或多个操作要么全部执行且执行过程不被中断,要么不执行(对应上方原子性操作)。
      java里面可以通过 synchronized和Lock实现原子性,因为synchronized和Lock能够保证任一时刻只有一个线程访问该代码块

    2. 可见性
      多个线程修改同一个共享变量时,一个线程修改后,其他线程能马上获得修改后的值
      Java提供了volatile关键字保证可见性
      synchronized和lock也可保证可见性,在加锁时其他线程无法访问共享资源

    3. 有序性
      被synchronized修饰的代码只能被被当前线程占用,避免由于其他线程的执行导致的无序行。
      volatile关键字包含了禁止指令重排序的语义,使其具有有序性。

      Java内存模型规定了所有的变量都存储在主内存中,每条线程还有自己的工作内存,线程的工作内存中保存了该线程中是用到的变量的主内存副本拷贝,线程对变量的所有操作都必须在工作内存中进行,而不能直接读写主内存。不同的线程之间也无法直接访问对方工作内存中的变量,线程间变量的传递均需要自己的工作内存和主存之间进行数据同步进行。

    相关文章

      网友评论

          本文标题:Java内存模型

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