#Java#互联网大厂面试必问的Java内存模型以及并发编程( 三 )
JMM 与 JVM 内存结构JMM 与 Java 内存区域中的堆、栈、方法区等并不是同一个层次的内存划分 , 两者基本没有关系 。 如果一定要勉强对应 , 那从变量、主内存、工作内存的定义看 , 主内存主要对应 Java 堆中的对象实例数据部分 , 工作内存则对应虚拟机栈的部分区域(与上图对应着看哈) 。
JMM 与计算机内存结构Java 内存模型和硬件内存体系结构也没有什么关系 。 硬件内存体系结构不区分栈和堆 。 在硬件上 , 线程栈和堆都位于主内存中 。 线程栈和堆的一部分有时可能出现在高速缓存和CPU寄存器中 。 如下图所示:
当对象和变量可以存储在计算机中不同的内存区域时 , 这就可能会出现某些问题 。 两个主要问题是:
- 线程更新(写)到共享变量的可见性
- 读取、检查和写入共享变量时的竞争条件
竞争条件(Race Conditions)这个其实就是我们常说的原子问题 。
如果两个或多个线程共享一个对象 , 并且多个线程更新该共享对象中的变量 , 则可能出现竞争条件 。
想象一下 , 如果线程A将一个共享对象的变量读入到它的CPU缓存中 。 此时 , 线程B执行相同的操作 , 但是进入不同的CPU缓存 。 现在线程A执行 +1 操作 , 线程B也这样做 。 现在该变量增加了两次 , 在每个CPU缓存中一次 。
如果这些增量是按顺序执行的 , 则变量结果会是3 , 并将原始值+ 2写回主内存 。 但是 , 这两个增量是同时执行的 , 没有适当的同步 。 不管将哪个线程的结构写回主内存 , 更新后的值只比原始值高1 , 显然是有问题的 。 如下(当然可以用 Java 提供的关键字 Synchronized)
JMM 特性JMM 就是用来解决如上问题的 。 JMM是围绕着并发过程中如何处理可见性、原子性和有序性这 3 个 特征建立起来的
- 可见性:可见性是指当一个线程修改了共享变量的值 , 其他线程能够立即得知这个修改 。 Java 中的 volatile、synchronzied、final 都可以实现可见性
- 原子性:即一个操作或者多个操作 , 要么全部执行并且执行的过程不会被任何因素打断 , 要么就都不执行 。 即使在多个线程一起执行的时候 , 一个操作一旦开始 , 就不会被其他线程所干扰 。
- 有序性:计算机在执行程序时 , 为了提高性能 , 编译器和处理器常常会对指令做重排 , 一般分为以下 3 种单线程环境里确保程序最终执行结果和代码顺序执行的结果一致;处理器在进行重排序时必须要考虑指令之间的数据依赖性;多线程环境中线程交替执行 , 由于编译器优化重排的存在 , 两个线程中使用的变量能否保证一致性是无法确定的 , 结果无法预测
- lock(锁定):作用于主内存的变量 , 它把一个变量标识为一条线程独占的状态 。
- unlock(解锁):作用于主内存的变量 , 它把一个处于锁定状态的变量释放出来 , 释放后的变量才可以被其他线程锁定 。
- 「互联网圈里人」你会操作吗?,微信可转账至QQ钱包
- 米家互联网洗烘一体机1C:米家互联网洗烘一体机1C发布:除菌率高达99.9% 支持小爱
- 「思维教授」不妨试试这个冷门行业,互联网创业:想在网络上暴利赚钱
- #杨龙伟卤菜店#如何利用互联网思维打造现卤现捞品牌
- 互联网乱侃先生@还债有望了?一场直播卖货1.7亿,罗永浩终于找对了方向
- 【独立保险经纪人平台】独立保险经纪人的发展红利——互联网保险
- 【互联网有爆料】414乐迷节期间销量将猛增,乐视电视或签约罗永浩
- 「三言车说」中小企业如何破题互联网场景“推广迷局”?
- 互联网揭秘▲为何国内不敌阿里京东?国外帅小伙答案令人信服,电商巨头亚马逊
- 【三言财经】全球移动互联网大会GMIC宣布改为4月25-27日线上举办
