zoukankan      html  css  js  c++  java
  • 理解JMM

    背景

    之前以为JMM就是JVM,后来才了解到JMM特指内存模型,和GC关联比较弱。

    书反复看了很多遍,看的时候觉得看懂了,但是放下书口述,总感觉说不明白。所以还是直接自己总结得了!

    一、JMM

    1、为什么需要JMM?

    JVM为了屏蔽硬件和操作系统对内存访问的差异,以实现让java程序在各种平台下都能达到一致的内存访问效果。

    2、JMM的背景

    CPU的运算很快,内存的运算速度很慢,但是大多数计算任务都不能只靠处理器“计算”就能完成,处理器至少要与内存交互。为了缓解速度不匹配的问题,人们在CPU和内存之间加入了高速缓存,让运算尽可能的快。但是这也带来了新的问题:缓存一致性。为了解决缓存一致性问题,所以对各个处理器访问缓存制定了协议,CPU在读写缓存数据时需要遵循协议。

    3、JMM的主要目标

    定义程序中各个变量的访问规则,即将变量存储到内存和从内存中取出变量这样的底层细节。

    4、线程、主内存、工作内存的关系

    1)每条线程有自己的工作内存,线程的工作内存中保存了该线程使用到的变量的主内存副本拷贝

    2)线程对变量的所有操作都必须在工作内存中进行

    3)不同的线程之间无法直接访问对方工作内存中的变量

    4)线程间变量值的传递都需要通过主内存来完成

    5、volatile特性

    1)保证此变量对所有线程的“可见性”

    当一条线程修改了一个变量的值,新值对于其他线程来说是可以立即得知的。

    2)禁止指令重排序优化

    6、原子性、可见性与有序性

    JMM是围绕在并发过程中如何处理原子性、可见性和有序性这3个特征来建立的。

    1)可见性

    JMM是通过在变量修改后将新值同步回主内存中,在变量读取前从主内存刷新变量值的操作来实现可见性。

    普通变量与volatile变量的区别是,volatile的变量新值能够被立即同步到主内存,以及每次使用前立即从主内存刷新。

    2)有序性

    synchronized是基于“一个变量在同一个时刻只允许一条线程对其进行lock操作”。

    二、线程

    Java线程模型是基于操作系统原生线程模型实现的。

    1、线程的状态转换

    新建:创建后尚未启动的线程

    运行:可能在运行,也有可能在等待CPU分配执行时间

  • 相关阅读:
    HTTP状态码
    Hibernate的配置与简单使用
    Java基础学习总结 -- 多线程的实现
    MySQL学习笔记 -- 数据表的基本操作
    Java基础学习 -- I/O系统、流
    理解文件的编码
    Java基础学习 -- 异常
    Java基础学习 -- GUI之 事件处理基础
    Java基础学习总结 -- 图形用户界面GUI
    Java基础学习 -- 接口
  • 原文地址:https://www.cnblogs.com/shuimutong/p/12388849.html
Copyright © 2011-2022 走看看