原子性

原子性是指一个操作或多个操作要么全部执行完成且执行过程不被中断,要么就不执行。

如向变量x赋值操作 x = 10 是原子性的,就不会出现赋值操作进行到一半(x的低16位赋值成功,高16位没有赋值)而被打断。

原子性的操作若涉及到变量,也意味着在操作过程中该变量不会被其他线程占有。

由java内存模型来直接保证的原子性变量操作包括read、load、use、assign、store和write,大致可认为基本数据类型的读写是具备原子性的(例外是long与double的非原子性协定)。

如果需要更大范围的原子性保证,java内存模型提供了lock与unlock操作来满足这种要求,虚拟机没有直接开放lock与unlock操作给用户,但却提供了更高层次的字节码指令monitorenter与monitorexit来隐式地使用这两个操作,这两个字节码反映到java代码块中就是同步块-synchronized关键字,因此synchronized块中的操作也具备原子性。

可见性

可见性是指当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。

Java内存模型是通过在变量修改后将新值同步回主内存,在变量读取前从主内存刷新变量值这种依赖主内存作为传递媒介的方法来实现可见性的。

除了volatile之外,Java还有两个关键字能实现可见性,它们是synchronized与final。同步块的可见性是由“对一个变量执行unlock操作之前,必须先把此变量同步回主内存中(执行store和write操作)”这条规则获得的,而final关键字的可见性是指:被final修饰的字段在构造器一旦初始化完成,并且构造器没有把“this”引用传递出去,那么在其它线程中就能看见final字段的值。

有序性

有序性即程序执行的顺序按照代码的先后顺序执行。

在Java内存模型中,允许编译器和处理器对指令进行重排序,但是重排序过程不会影响到单线程程序的执行,却会影响到多线程并发执行的正确性。

Java语言提供了volatile和synchronized两个关键字来保证线程之间操作的有序性,volatile关键字本身就包含了禁止指令重排序的语义,而synchronized则是由“一个变量在同一时刻只允许一条线程对其进行lock操作”这条规则来获得的。

java原子性是什么,java 原子性 可见性 有序性相关推荐

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

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

  2. java 类型不可视_jvm高级特性(5)(1)(原子性,可见性,有序性,volatile,概述)

    简介: 阿姆达尔定律(Amdahl):该定律通过系统中并行化与串行化的比重来描述多处理器系统能获得的运算加速能力. 摩尔定律(Moore):该定律用于描述处理器晶体管数量与运行效率间的发展关系. 当价 ...

  3. 重点知识学习(8.2)--[JMM(Java内存模型),并发编程的可见性\原子性\有序性,volatile 关键字,保持原子性,CAS思想]

    文章目录 1.JMM(Java Memory Model) 2.并发编程的可见性 3.并发编程的有序性 4.并发编程的原子性 5.volatile 关键字 6.保持原子性: 加锁,JUC原子类 加锁 ...

  4. 【漫画】JAVA并发编程三大Bug源头(可见性、原子性、有序性)

    原创声明:本文转载自公众号[胖滚猪学编程]​ 某日,胖滚猪写的代码导致了一个生产bug,奋战到凌晨三点依旧没有解决问题.胖滚熊一看,只用了一个volatile就解决了.并告知胖滚猪,这是并发编程导致的 ...

  5. java 轻量级同步volatile关键字简介与可见性有序性与synchronized区别 多线程中篇(十二)...

    概念 JMM规范解决了线程安全的问题,主要三个方面:原子性.可见性.有序性,借助于synchronized关键字体现,可以有效地保障线程安全(前提是你正确运用) 之前说过,这三个特性并不一定需要全部同 ...

  6. 如何保证线程安全有序性_线程安全性-原子性-可见性-有序性

    一.相关定义: 线程安全类:当多个线程访问某个类时,不管运行环境采用何种调度方式或者这些进程如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么就称这个类是线程安 ...

  7. 原子性 可见性 有序性_极简主义的内容可见性

    原子性 可见性 有序性 A couple of years ago, Minimalism as a concept took over the design world. 几年前, 极简主义作为一种 ...

  8. Java 可重入锁内存可见性分析

    转载自 深度好文 | Java 可重入锁内存可见性分析 一个习以为常的细节 之前在做 ReentrantLock 相关的试验,试验本身很简单,和本文相关的简化版如下:(提示:以下代码均可左右滑动) p ...

  9. Java并发编程:Java内存模型JMM

    简介 Java内存模型英文叫做(Java Memory Model),简称为JMM.Java虚拟机规范试图定义一种Java内存模型来屏蔽掉各种硬件和系统的内存访问差异,实现平台无关性. CPU和缓存一 ...

最新文章

  1. 如何利用 C# 实现神经网络的感知器模型?
  2. Reflector for net用法 .
  3. 压缩 20M 文件从 30 秒到 1 秒的优化过程!
  4. Redis分布式部署,一致性hash
  5. gerrit的使用和配置
  6. 查看MS-SQL的安装版本及补丁
  7. 关于计算机的使用方法中心,关于新校区行政楼和活动中心楼网络使用的说明
  8. fread读取整个文件_qt如何实现大文件的加载和显示
  9. Redis主从配置详细过程
  10. 更改项目文件夹图标(程序图标)
  11. 阿里技术小哥,写了一个“​废话生成器”!火爆内网,演绎了什么叫“阿里味“!...
  12. jsp购物车系统01
  13. casual Convolution 和 dilated Convolution
  14. 多线程-day-09CAS原理
  15. 运动竞技类图文展示片头fcpx插件
  16. IO缓冲(buffer)和高速缓存(cache)
  17. gerrit 数据迁移_详解git仓库迁移的两种解决方案
  18. 光纤布线对企业基础设施网络的五大影响
  19. NNDL 实验六 卷积神经网络(3) LeNet实现MNIST
  20. PHP开发微信支付代码及支付通知处理

热门文章

  1. 毕节市搜索引擎优化_毕节市关键词是什么刷关键词排名
  2. android驱动框架介绍
  3. “AI+”概念是什么?(附十大概念股)
  4. MFC编辑框实现回车换行
  5. (保姆级教程)基于YOLOX(pytorch)的安全帽检测
  6. 在Docker容器上利用Scrapy-Redis框架的分布式爬虫
  7. 学习记录(六)(每日修改)
  8. NOIP 2017 图书管理员
  9. SUSE挂载消失不见的 3T SCSI硬盘
  10. keycloak php,Keycloak未知提供者错误