美文网首页
Java技术之原子性、可见性、有序性。

Java技术之原子性、可见性、有序性。

作者: 老羊_肖恩 | 来源:发表于2017-10-16 14:18 被阅读117次

基本概念

并发编程中我们一般都会遇到这三个基本概念:原子性、可见性、有序性。

原子性

  原子性:即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。原子性类似于数据库里面的事务,理解原子性非常简单,下面有一个例子。

i = 0;
j = i;
i++;
i = j + 1;

 上述四个操作中,只有第一个此时原子操作,其余均不是。

i = 0;        //在Java中,对基本数据类型的变量和赋值操作都是原子性操作;
j = i;        //包含了两个操作:读取i,将i值赋值给j
i++;          //包含了三个操作:读取i值、i + 1 、将+1结果赋值给i;
i = j + 1;    //同上

  在单线程环境下我们可以认为整个步骤都是原子性操作,但是在多线程环境下则不同,Java只保证了基本数据类型的读取和赋值操作才是原子性的(注:在32位的JDK环境下,对64位数据的读取不是原子性操作*,如long、double)。要想在多线程环境下保证原子性,则可以通过锁、synchronized来确保。

Java中的原子操作包括:
  1)除long和double之外的基本类型的赋值操作
  2)所有引用reference的赋值操作
  3)java.concurrent.Atomic.* 包中所有类的一切操作。

可见性

  可见性是指当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。
  在多线程环境下,一个线程对共享变量的操作对其他线程是不可见的。
  Java提供了volatile关键字来保证可见性。当一个共享变量被volatile修饰时,它会保证修改的值会立即被更新到主存,当有其他线程需要读取时,它会去内存中读取新值。而普通的共享变量不能保证可见性,因为普通共享变量被修改之后,什么时候被写入主存是不确定的,当其他线程去读取时,此时内存中可能还是原来的旧值,因此无法保证可见性。另外,通过synchronized和Lock也能够保证可见性,synchronized和Lock能保证同一时刻只有一个线程获取锁然后执行同步代码,并且在释放锁之前会将对变量的修改刷新到主存当中。因此可以保证可见性。

有序性

  有序性:即程序执行的顺序按照代码的先后顺序执行。
  在Java内存模型中,为了效率是允许编译器和处理器对指令进行重排序,但是重排序过程不会影响到单线程程序的执行,却会影响到多线程并发执行的正确性。(例如:重排的时候某些赋值会被提前)
  在Java里面,可以通过volatile关键字来保证一定的“有序性”(具体原理在下一节讲述)。另外可以通过synchronized和Lock来保证有序性,很显然,synchronized和Lock保证每个时刻是有一个线程执行同步代码,相当于是让线程顺序执行同步代码,自然就保证了有序性

相关文章

  • jvm

    JAVA内存模型: 有序性、可见性、原子性 导致可见性的原因是缓存,导致有序性的原因是编译优化 涉及 vol...

  • volatile和synchronized底层原理

    先来看 JMM java memory model java 内存模型 主要围绕:原子性,可见性,有序性。 A B...

  • 浅谈java高并发

    JMM JMM是java的内存模型,JMM的关键技术就是围绕着多线程的原子性,可见性,有序性来建立的。 1.原子性...

  • Java 中的volatile 关键字

    并发编程的三个特性 原子性 有序性 可见性 Java 中的volatile 关键字能保证可见性和有序性,但是无法保...

  • Java高并发--原子性可见性有序性

    Java高并发--原子性可见性有序性 主要是学习慕课网实战视频《Java并发编程入门与高并发面试》的笔记 原子性:...

  • Java技术之原子性、可见性、有序性。

    基本概念 并发编程中我们一般都会遇到这三个基本概念:原子性、可见性、有序性。 原子性   原子性:即一个操作或者多...

  • 《实战高并发程序设计》读书笔记-线程基本知识补充

    volatile   Java内存模型都是围绕着原子性、有序性和可见性展开的,为了在适当的场合,确保线程间的有序性...

  • java初入多线程5

    volatile 与java内存模型(JMM) java的内存模型都是围绕着原子性、有序性、还有可见性来展开的。 ...

  • 理解java中的Synchronized关键字

    开篇知识了解 插入知识 JMM(java内存模型)的关键技术都是围绕着多线程的原子性,可见性,有序性来建立的。因此...

  • Java并发编程基础

    Java并发程序的设计 并发的三大特性:原子性,可见性和有序性。 原子性 原子性指的是一个操作一旦开始就不可中断。...

网友评论

      本文标题:Java技术之原子性、可见性、有序性。

      本文链接:https://www.haomeiwen.com/subject/pmpzyxtx.html