源地址: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.docx
深入Java内存模型-JMM。。。。。。。。。。。。。。。。。。
java内存模型jmm
JMM内存模型的一次记录
入门小白概念
JMM内存模型图解说秒懂
有关JVM内存模型的概述,用于对JVM的整体把握从而针对性的学习
Java Memory Model简称JMM, 是一系列的Java虚拟机平台对开发者提供的多线程环境下的内存可见性、是否可以重排序等问题的无关具体平台的统一的保证。(可能在术语上与Java运行时内存分布有歧义,后者指堆、方法区、...
Java内存模型及Volatile底层实现原理
14、深入理解井发可见性、有序性、原子性与JMM内存模型 (1).pdf 15、CPU缓存架构详解&高性能内存队列Disruptor 实战 (1).pdf 16、常用并发设计模式精讲 (1).pdf designpattern.zip disruptor.zip forkjoin.zip jmm(1...
Java程序是需要运行在Java虚拟机上面的,Java内存模型(Java Memory Model ,JMM)就是一种符合内存模型规范的,屏蔽了各种硬件和操作系统的访问差异的,保证了Java程序在各种平台下对内存的访问都能保证效果一致的...
微信小程序详细图文教程 泉州大白网络科技 目录 一.微信小程序申请 二....1.申请服务器 2.部署服务器 3.域名申请和配置 三....一....申请,并认证(未认证不能发布,认证需要300元,目前只支持企业认证)详细见官网说明。...
主要介绍了Java内存模型JMM详解,涉及volatile和监视器锁,final字段,内存屏障等相关内容,具有一定参考价值,需要的朋友可以了解下。
Java开发
本书目录 基础 并发编程模型的分类 Java内存模型的抽象 重排序 ...JMM,处理器内存模型与顺序一致性内存模型之间的关系 JMM的设计 JMM的内存可见性保证 JSR-133对旧内存模型的修补 个人简介 参考文献
14、深入理解井发可见性、有序性、原子性与JMM内存模型 (1).pdf 15、CPU缓存架构详解&高性能内存队列Disruptor 实战 (1).pdf 16、常用并发设计模式精讲 (1).pdf designpattern.zip disruptor.zip forkjoin.zip jmm(1...
在Java语言中,采用的是共享内存模型来实现多线程之间的信息交换和数据同步的。线程之间通过共享程序公共的状态,通过读-写内存中公共状态的方式来进行隐式的通信。同步指的是程序在控制多个线程之间执行程序的相对...
由于JVM运行程序的实体是线程,而每个线程创建时JVM都会为其创建一个工作内存(有些地方称为栈空间),工作内存是每个线程的私有数据区域,而Java内存模型中规定