源地址:http://blog.csdn.net/gtuu0123/article/details/5991869
一、指令重排序
1.javac生成字节码时,及字节码被JIT编译器编译成本地代码时,会进行指令的重排序
2.处理器可以乱序和并发执行指令
3.如果没有充分同步,在另一个线程中完全可以看到一个线程代码执行顺序和“理所当然”的顺序不一致
以上的程序,可能会打印出x=0,y=0;x=1,y=0;x=0,y=1;x=1,y=1
4.要使程序的执行可以预测,JMM必然会做一些规定限制,那就是happens-before规则,final初始化规则
二、happens-before
1.是一种偏序关系
2.规则:
(1)同一个线程中的每个action都happens-before于出现在其后的任何一个action
(2)对一个监视器的解锁happens-before于每一个后续对同一个监视器的加锁
(3)对volatile字段的写入操作happens-before于每一个后续的同一个字段的读操作
(4)Thread.start()的调用会happens-before于启动线程里面的动作
(5)Thread中的所有动作都happens-before于其他线程检查到此线程结束或者Thread.join()中返回或者Thread.isAlive()==false
(6)一个线程调用另一个线程的interrupt happens-before于被中断的线程发现中断(通过抛出InterruptedException,或者调用isInterrupted和interrupted)
(7)一个对象构造函数的结束happens-before与该对象的finalizer的开始
(8)如果A动作happens-before于B动作,而B动作happens-before与C动作,那么A动作happens-before于C动作
3.代码分析:
a)利用规则(1)、(3)和(8)分析
b)result=v < releaseShared(0)
c)acquireSharedInterruptibly(0) < return result
d)在releaseShared(0)、 acquireSharedInterruptibly(0)中会操作AQS中的一个volatile变量
e)releaseShared(0) < acquireSharedInterruptibly(0)
f)因此,result不设置为volatile类型也可以具有volatile类型的可见性
三、final初始化规则
1.当构造函数执行完成后,对象创建正确,无论怎样发布,所有线程都能看到final域的值,并且任何通过final域触及到的变量(一个final的数组中的元素,一个final的HashMap中的元素),也都是可见的
2.保证了不变对象可以通过任何方式发布
四、double-check lock
1.起源于为了改善synchronized的单例的性能
2.由于外层的resource未进行同步,因此即使resource的引用可见了,但是resource的状态不一定可见,因此可能一个线程读到resource并未构造成功
3.改进:Holder模式,利用了在ClassLoader加载类时才会初始化类的static成员
- public class Singleton {
- static class Holder {
- public final static Singleton unique = new Singleton();
- }
- public static Singleton getInstance() {
- return Holder.unique;
- }
- }
五、ABA问题
(1)cas中,内存V的值由A改为B,又改为A,那么按照compareAndSet(T oldValue, T newValue),由于内存V没有版本号,所以cas会成功,因为忽略过程来看,内存V的值没有变化还是A
(2)AtomicStampedReference利用版本化方案,替代AtomicReference解决这一问题
相关推荐
Java运行时内存模型图
深入理解并发可见性、有序性、原子性与JMM内存模型深入理解并发可见性、有序性、原子性与JMM内存模型深入理解并发可见性、有序性、原子性与JMM内存模型深入理解并发可见性、有序性、原子性与JMM内存模型深入理解并发...
Java内存模型详解JMM Java内存模型(Java Memory Model,JMM)是Java虚拟机(JVM)中的一种内存模型,它描述了程序中各个变量之间的关系,以及在实际计算机系统中将变量存储到内存和从内存中取出变量这样的底层细节...
jmm模型ppt基本概念介绍 Java内存模型(Java Memory Model,JMM)是Java虚拟机(JVM)中的一种抽象概念,描述了一组规则或规范,定义了程序中各个变量的访问方式。JMM围绕原子性、有序性、可见性展开,确保了Java...
Java内存模型,简称JMM(Java Memory Model),是Java虚拟机规范中定义的一个抽象概念,它描述了在多线程环境下,如何保证各个线程对共享数据的一致性视图。JMM的主要目标是定义程序中各个变量的访问规则,以及在...
### 三问JMM——有关JVM内存模型的深度解析 #### 前言 近期,在诚信通开源研究小组的专题学习分享会上,我们针对Java内存模型(JMM)进行了深入探讨,现将JMM相关的一些核心概念进行梳理,以便更好地理解和把握JMM的...
JMM内存模型的一次记录
JMM内存模型图解说秒懂
Java内存模型(JMM,Java Memory Model)是Java平台中用于定义线程间共享变量的访问规则的一个抽象概念,它规定了线程如何与主内存交互,以及对共享变量的操作顺序。在Java并发编程中,理解JMM至关重要,因为它直接...
Java内存模型(Java Memory Model,简称JMM)是Java并发编程中的核心概念,它定义了Java程序中多线程间共享变量的访问规则。理解JMM对于编写正确、高效的并发程序至关重要。本文将深入探讨JMM的原理、特性以及如何在...
Java Memory Model简称JMM, 是一系列的Java虚拟机平台对开发者提供的多线程环境下的内存可见性、是否可以重排序等问题的无关具体平台的统一的保证。(可能在术语上与Java运行时内存分布有歧义,后者指堆、方法区、...
Java内存模型及Volatile底层实现原理
Java 内存模型(JMM)是Java虚拟机(JVM)规范中的一部分,它旨在确保多线程环境下,程序的正确性和可预测性。JMM处理的主要问题是内存的可见性和一致性,它定义了线程如何与主内存交互以及如何共享变量。 在计算机...
Java内存模型(JMM,Java Memory Model)是Java平台中用于描述如何在多线程环境中管理内存的一套规范。它确保了并发编程时不同线程之间的数据一致性、可见性和原子性,以避免出现数据竞争和其他并发问题。以下是JMM...
Java内存模型(JMM,Java Memory Model)是Java平台中用于定义线程间如何共享变量以及如何同步操作的重要概念。最新版的JMM模拟器提供了一种可视化的方式,帮助开发者理解并模拟Java内存模型的工作机制,这对于理解...
Java内存模型(JMM)是并发编程中的核心概念,它通过定义线程与主内存之间的交互规则,确保了多线程程序的正确性和内存的一致性。理解JMM的工作原理和特性,对于编写高效、可靠的并发程序至关重要。通过使用volatile...
Java程序是需要运行在Java虚拟机上面的,Java内存模型(Java Memory Model ,JMM)就是一种符合内存模型规范的,屏蔽了各种硬件和操作系统的访问差异的,保证了Java程序在各种平台下对内存的访问都能保证效果一致的...
在深入理解Java内存模型(JMM)及并发三大特性方面,我们需要先建立对多线程、共享内存模型、可见性、有序性和原子性的基础概念。Java内存模型是Java并发编程的核心,它定义了共享变量在多线程环境中的行为规则和...
微信小程序详细图文教程 泉州大白网络科技 目录 一.微信小程序申请 二....1.申请服务器 2.部署服务器 3.域名申请和配置 三....一....申请,并认证(未认证不能发布,认证需要300元,目前只支持企业认证)详细见官网说明。...
主要介绍了Java内存模型JMM详解,涉及volatile和监视器锁,final字段,内存屏障等相关内容,具有一定参考价值,需要的朋友可以了解下。