美文网首页
Java内存模型与线程——原子性、可见性、有序性

Java内存模型与线程——原子性、可见性、有序性

作者: JESiller | 来源:发表于2018-04-28 15:49 被阅读44次

关于主内存和工作内存之间具体的交互协议,即一个变量如何从主内存拷贝到工作内存、如何从工作内存同步回主内存之类的实现细节,Java内存模型中定义了以下8种操作来完成,虚拟机实现时必须保证下面提及的每一种操作都是原子的、不可再分的

图片.png

1.原子性

一个操作或者多个操作,一旦被执行就不能被中断,否则就不执行。
如果应用需要更大范围的原子性操作,Java还提供了lock和unlock来满足这种需求,尽管虚拟机没有直接把lock和unlock操作直接开放给用户使用,但是却提供更高的字节码指令monitorenter 和monitorexit来隐式使用这两个操作,这两个字节码指令反应到Java代码语句就是同步块synchronized 关键字,synchronized块之间的操作也是具备原子性。

2.可见性

当一个线程修改了共享变量的值,其他线程能够立即得知这个值。
Java内存模型是通过在变量修改之后将新值同步回主内存,在变量读取前,从主内存刷新变量值这种依赖主内存作为传递媒介的方式来实现可见性,无论是普通变量还是volatile变量都是一样的,两者的区别是volatile特殊规则保证了新值能立即同步到主内存,以及每一次使用前能立即从主内存刷新,因此,可以说volatile保证了多线程操作时变量的可见性,而普通变量则不能保证这一点。
除了volatile,还有两个关键字也可实现可见性,synchronized和final。

3.有序性

Java程序中,天然的有序性可以总结为一句话:如果在本线程内观察,所有操作都是有序的,如果在一个线程中观察另外一个线程,所有的操作都是无序的,前半句是指线程内表现为串行的语义,后半句是指“指令重排序现象和工作主内存和主内存同步延迟的现象”
Java语言提供了volatile和synchronized两个关键字来保证了线程之间操作的有序性,volatile有禁止指令重排的语义,而synchronized则是由一个变量在同一时刻只允许一条线程对其进行lock操作这条规则获得的,这条规则决定了持有同一个锁的两个同步块只能串行地进入。

相关文章

  • Java内存模型-笔记5

    硬件内存模型 Java内存模型 线程之间通信同步性原则 可能出现的问题可见性原子性有序性 硬件内存模型 工程师为了...

  • java初入多线程5

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

  • Java内存模型&DCL双锁检测

    Java内存模型 内存模型是为了保证共享内存的正确性(可见性、有序性、原子性),其定义了共享内存系统中多线程程序读...

  • Java-可见性、原子性、有序性

    关键字:Java内存模型(JMM)、线程安全、可见性、原子性、有序性 1.线程安全(JMM) 多线程执行某个操作的...

  • 聊一聊Java内存模型

    之前提到的原子性、可见性、有序性都与Java内存模型(JMM)密不可分。在Java内存模型中定义了主内存和线程的工...

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

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

  • volatile和synchronized底层原理

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

  • volatile关键字

    Java 内存模型中的可见性、原子性和有序性。 可见性:可见性,是指线程之间的可见性,一个线程修改的状态对另一个线...

  • 浅谈java高并发

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

  • Volatile关键字详解

    基本概念 Java 内存模型中的可见性、原子性和有序性。 可见性:是指线程之间的可见性,一个线程修改的状态对另一个...

网友评论

      本文标题:Java内存模型与线程——原子性、可见性、有序性

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