原子性:

原子性就是指该操作是不可再分的。不论是多核还是单核,具有原子性的量,同一时刻只能有一个线程来对它进行操作。简而言之,在整个操作过程中不会被线程调度器中断的操作,都可认为是原子性。比如 a = 1;

非原子性:

也就是整个过程中会出现线程调度器中断操作的现象

类似"a ++"这样的操作不具有原子性,因为它可能要经过以下两个步骤:

(1)取出 a 的值

(2)计算 a+1

如果有两个线程t1,t2在进行这样的操作。t1在第一步做完之后还没来得及加1操作就被线程调度器中断了,于是t2开始执行,t2执行完毕后t1开始执行第二步(此时t1中a的值可能还是旧值,不是一定的,只有线程t2中a的值没有及时更新到t1中才会出现)。这个时候就出现了错误,t2的操作相当于被忽略了

类似于a += 1这样的操作都不具有原子性。还有一种特殊情况,就是long跟double类型某些情况也不具有原子性,具体可参考:java中long和double类型操作的非原子性探究

共享变量:如果一个变量在多个线程的工作内存中都存在副本,那么这个变量就是这个几个线程的共享变量

可见性:一个线程对共享变量值的修改,能够及时的被其它线程看到。

    在多线程的情况下,共享变量不一定是可见的。要想实现变量的一定可见,可以使用synchronized、volatile两种方式(其实还有final,但是它初始化后,值不可  更改,所以一般不用它实现可见性)。具体做法可参考:synchronized实现可见性volatile特性

Java内存模型(Java Memory Model) 描述了Java程序各种变量(线程共享变量)的访问规则,以及在JVM中将变量存储到内存和从内存中读取出变量这样的底层细节。

在Java内存模型(以下简称为JMM)中:

  1) 所有的变量都存储在主内存中

  2)每个线程都有自己独立的工作内存,里面保存该线程使用到的变量的副本(主内存中该变量的一份拷贝)

用下面的图可以直观的看到JMM中,线程、工作内存、主内存之间的关系:

  

在上面的图中,可以看到线程只与工作内存交互,不能直接访问主内存。当主内存中有一个共享变量X,则工作内存则是将X拷贝,然后线程是操作工作内存中X的副本

在JMM中,有两条规定:

  1)线程对共享变量的所有操作都必须在自己的工作内存中进行,不能直接从主内存中读写

  2)不同线程之间无法访问其他线程工作内存中的变量,线程间变量值的传递需要通过主内存来完成

共享变量要实现可见性,必须经过如下两个步骤:

  1)把工作内存1中更新过的共享变量刷新到主内存中

  2)把主内存中最新的共享变量的值更新到工作内存2中

  

Java原子性、可见性、内存模型的更多相关文章

  1. 关于JAVA中的static方法、并发问题以及JAVA运行时内存模型

    一.前言 最近在工作上用到了一个静态方法,跟同事交流的时候,被一个问题给问倒了,只怪基础不扎实... 问题大致是这样的,“在多线程环境下,静态方法中的局部变量会不会被其它线程给污染掉?”: 我当时的想 ...

  2. Java对象的内存模型(一)

    前言 新人一枚,刚刚入门编程不久,各方面都在学习当中,博文有什么错误的地方,希望我们可以多多交流! 最近,在开发App后台过程中,需要将项目部署到云服务器上.而云服务器的内存大小却只有1G.要如何做到 ...

  3. Java虚拟机:内存模型详解

    版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! 我们都知道,当虚拟机执行Java代码的时候,首先要把字节码文件加载到内存,那么这些类的信息都存放在内存中的哪个区域呢?当我们创建一个对象实 ...

  4. java虚拟机的内存模型

    一.为什么要了解java虚拟机的内存模型 java虚拟机作为java代码运行的平台,是java技术的基石.了解java虚拟机的内存模型也就变得十分必要.它能帮助我们更好的了解java代码的运行机制,更 ...

  5. Java高级之内存模型分析

    博客出自:http://blog.csdn.net/liuxian13183,转载注明出处! All Rights Reserved ! 下文是博主感悟,请带着怀疑性的态度阅读! 需要了解基本变量所占 ...

  6. java 原子性 可见性 有序性

    原子性 原子性是指一个操作或多个操作要么全部执行完成且执行过程不被中断,要么就不执行. 如向变量x赋值操作 x = 10 是原子性的,就不会出现赋值操作进行到一半(x的低16位赋值成功,高16位没有赋 ...

  7. java中的内存模型

    概述 Java平台自动集成了线程以及多处理器技术,这种集成程度比Java以前诞生的计算机语言要厉害很多,该语言针对多种异构平台的平台独立性而使用的多线程技术支持也是具有开拓性的一面,有时候在开发Jav ...

  8. 多线程与Java的JMM内存模型

    共享内存模型指的就是Java内存模型(简称JMM),JMM决定一个线程对共享变量的写入时,能对另一个线程可见.从抽象的角度来看,JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存( ...

  9. Java并发之内存模型(JMM)浅析

    背景 学习Java并发编程,JMM是绕不过的槛.在Java规范里面指出了JMM是一个比较开拓性的尝试,是一种试图定义一个一致的.跨平台的内存模型.JMM的最初目的,就是为了能够支多线程程序设计的,每个 ...

  10. java虚拟机10.内存模型与线程

    多任务处理在现代计算机操作系统中是一项必备的功能,让计算机同时去做几件事情,不仅是因为计算机的运算能力强大了,更重要的原因是计算机的运算速度与它的存储和通信子系统速度的差距太大,大量的时间都花费在磁盘 ...

随机推荐

  1. .NET Core 类库中读取appsettings.json

    { "Logging": { "IncludeScopes": false, "LogLevel": { "Default&quo ...

  2. C#深入浅出获取时间DateTime

    首先,先了解微软.net里面的DateTime的DateTime.Now.DateTime.Now.Date.DateTime.Now.Day.DateTime.Now.DayOfWeek.DateT ...

  3. VS2017仅我的代码警告

    每次调试都会出现"仅我的代码"警告,特别的烦人,取消方法如下: 1.点击工具,选择选项. 2.选择调试→常规,取消“启动时若没有用户代码则发出警告(仅限托管)”选项.

  4. JS时间戳转时间格式

    //转化为时间格式 function getDate(timestamp) { timestamp = timestamp.replace("/Date(", "&quo ...

  5. 知物由学 | AI时代,那些黑客正在如何打磨他们的“利器”?(一)

    本文由  网易云发布. “知物由学”是网易云易盾打造的一个品牌栏目,词语出自汉·王充<论衡·实知>.人,能力有高下之分,学习才知道事物的道理,而后才有智慧,不去求问就不会知道.“知物由学” ...

  6. Day 12 作业.(完成)

    1,将装饰器的所有知识点总结完成,将这几天的作业再整理一遍,还是不会的,就抄代码,一遍不行就三遍,直到所有知识点,所有题都整明白. 2,有时间就画流程图,梳理知识点. 3,上面两项完成的写以下作业. ...

  7. Masnory 学习

    1:typeof <一元运算符,放在一个运算数之前,运算数可以是任何类型, 用于获取括号中的运算数的数据类型如:NSString CGFloat Int NSArray等> 2:  str ...

  8. 使用Navicat 创建mysql存储过程,实现日期加流水号序列

    目的:使用Navicat 创建mysql存储过程,实现格式为8位日期(年月日)+5位流水号序列. 步骤: 1.打开Navicat 登录数据库,点击导航栏上的函数,如下图: 2.点击新建函数,选择“过程 ...

  9. javascript浅拷贝深拷贝理解记录

    javascript的深拷贝和浅拷贝问题几乎是面试必问的问题.好记性不如烂笔头,特此来记录一下自己对深拷贝浅拷贝的理解. 顾名思义,拷贝就是copy复制,在js中可以浅而理解为对一个对象或者数组的复制 ...

  10. 用postman做接口测试实例

    使用postman做接口测试,可以选择请求方式,可以直接输入参数和header,可以编写测试结果的代码,判断是否通过测试 下图为填写接口测试地址.填写接口的参数,点击send发送请求 其中,Param ...