为什么80%的码农都做不了架构师?>>>   

Java 内存模型


线程之间的共享变量存储在主内存(main memory)中,每个线程都有一个私有的本地内存(local memory),本地内存中存储了该线程以读/写共享变量的副本。

本地内存是JMM(Java内存模型)的一个抽象概念,并不真实存在。它涵盖了缓存,写 缓冲区,寄存器以及其 他的硬件和编译器优化。Java内存模型的抽象示意图如下图:

i++操作实质


对于一个简单的 i++ 操作,结合上图1 ,会发生如下的步骤:

  • read:作用于主内存中,把主内存中一个变量的值传输到 工作内存 中。
  • load:作用于工作内存,把从read 操作从主内存中得到的值放入到工作内存的副本中。
  • use:把工作内存中的该副本值传递给执行引擎(也就是操作数栈中)。
  • assign:作用于工作内存,把执行引擎执行后的新值传递给该工作内存的变量。
  • store:作用于工作内存,把工作内存中该变量的值传送到 主内存中去。
  • write:作用于主内存的变量,把store 操作 得到的值写入到 主内存的该变量中。

所以说,一个 i++操作并不是原子性的。这上述的这些步骤中,可能会有其他线程对主内存的变量进行操作,从而导致出现多线程问题。

转载于:https://my.oschina.net/icanos/blog/715647

多线程生成的原因(Java内存模型与i++操作解析)相关推荐

  1. java 线程 原子性_深入理解Java多线程与并发框架——Java内存模型与原子性、可见性、有序性...

    欢迎关注专栏<Java架构筑基>--专注于Java技术的研究与分享!Java架构筑基​zhuanlan.zhihu.comJava架构筑基--专注于Java技术的研究与分享! 后续文章将首 ...

  2. 深入理解JVM虚拟机(十):Java内存模型与多线程

    1. 硬件的效率与缓存一致性 由于存储设备和处理器运算速度之间的存在巨大的差异,现在计算机系统在内存与处理器之间加入高速缓存来作为处理器与内存之间的缓冲.将处理器需要的数据复制到缓存中,让处理器可以快 ...

  3. java内存模型 原子性_Java内存模型JMM 高并发原子性可见性有序性简介 多线程中篇(十)...

    JVM运行时内存结构回顾 在JVM相关的介绍中,有说到JAVA运行时的内存结构,简单回顾下 整体结构如下图所示,大致分为五大块 而对于方法区中的数据,是属于所有线程共享的数据结构 而对于虚拟机栈中数据 ...

  4. 一篇文章弄懂Java多线程基础和Java内存模型

    文章目录 一.多线程的生命周期及五种基本状态 二.Java多线程的创建及启动 1.继承Thread类,重写该类的run()方法 2.通过实现Runnable接口创建线程类 3.通过Callable和F ...

  5. java内存模型按照线程隔离性_深入理解Java多线程与并发框(第③篇)——Java内存模型与原子性、可见性、有序性...

    一.Java内存模型 Java Memory Modle,简称 JMM,中文名称 Java内存模型,它是一个抽象的概念,用来描述或者规范访问内存变量的方式.因为各中计算机的操作系统和硬件不同,方式机制 ...

  6. java 内存模型 多线程_Java 高并发三:Java内存模型和线程安全详解

    网上很多资料在描述Java内存模型的时候,都会介绍有一个主存,然后每个工作线程有自己的工作内存.数据在主存中会有一份,在工作内存中也有一份.工作内存和主存之间会有各种原子操作去进行同步. 下图来源于这 ...

  7. Java 内存模型如何保证多线程安全

    掌握线程安全及多线程问题是我们编写高性能代码的基础,下面将从理论到实践,一层一层的解开. 1. 什么是线程安全? 我们用<java concurrency in practice >中的一 ...

  8. java多线程-线程创建-线程池-java内存模型

    文章目录 ==多线程基础== 进程 线程 浏览器的进程和线程(案例) 线程的异步和同步 多线程的优势 ==多线程的实现方式== 第一种:继承Thread类 第二种:实现Runnable接口 第三种:通 ...

  9. java多线程学习二、安全与不安全示例:12306买票和银行取钱、java内存模型、内存可见性、线程同步块和方法

    文章目录 前言 1. 什么是块,分为几种 2. 静态块与构造块的区别 一. 举例说明:并发情况下,线程不安全 1. 示例1:unsafe12306取票 2. 示例2:unsafe银行取钱 二.线程不安 ...

最新文章

  1. 数据结构--快速排序
  2. codevs——2853 方格游戏(棋盘DP)
  3. HTML5 file api读取文件的MD5码工具
  4. http 直接显示目录下文件_Linux文件管理(下)
  5. Spring框架 DI
  6. 学习Python技术,怎么才能更好找到工作
  7. 用Javascript实现面向对象编程(封装,抽象,继承,多态)
  8. MySQL 复习笔记
  9. 经典扫雷游戏Web版
  10. 《西游降魔篇》[BD-RMVB.720p.国语中字][2013年奇幻冒险喜剧]
  11. STOP:0x0000007E蓝屏软件故障处理一例
  12. 操作系统期末大题类型题解
  13. 基于显著性检验分析两个样本分布相似度及Python实现—— t检验、拟合优度检验、KS检验、Wilcoxon符号秩检验、H检验、Mann-Whitney秩检验、P值的意义、API汇总
  14. 串口调试助手没有显示
  15. Ol3中Map事件全解析
  16. python,全自动获取图片,并下载你喜欢的美女图片
  17. Aspose.Words 复制表格并将复制的表格插入原有表格后面
  18. electron静默打印v_13,webview方式的相关配置
  19. 什么是死锁?死锁的预防?
  20. jmeter逻辑控制器之while循环控制器(一)

热门文章

  1. AngularJS开发指南
  2. 仿新浪新闻中异步替换关键字
  3. 方便好用的接口协作工具
  4. C#中的字符与字符串
  5. 软件测试的定义与分类
  6. Given two binary trees, write a function to check if they areequal or not.
  7. android怎样判断插入数据是否成功_Android 端 V1/V2/V3 签名的原理
  8. mysql 如何选择2行_MYSQL – 从大表中的第二行中选择数据
  9. 学java出来工作会很忙吗?
  10. 这10个实用的Javascript调试技巧,你知道吗?