`

(转)JMM模型

 
阅读更多

 

源地址: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成员

 

[java] view plaincopy
 
  1. public class Singleton {  
  2.   static class Holder {  
  3.      public final static Singleton unique = new Singleton();  
  4.   }  
  5.   public static Singleton getInstance() {  
  6.       return Holder.unique;  
  7.   }  
  8. }  

 

 

五、ABA问题

(1)cas中,内存V的值由A改为B,又改为A,那么按照compareAndSet(T oldValue, T newValue),由于内存V没有版本号,所以cas会成功,因为忽略过程来看,内存V的值没有变化还是A
(2)AtomicStampedReference利用版本化方案,替代AtomicReference解决这一问题
 

分享到:
评论

相关推荐

    JMM内存模型图

    Java运行时内存模型图

    14、深入理解并发可见性、有序性、原子性与JMM内存模型

    深入理解并发可见性、有序性、原子性与JMM内存模型深入理解并发可见性、有序性、原子性与JMM内存模型深入理解并发可见性、有序性、原子性与JMM内存模型深入理解并发可见性、有序性、原子性与JMM内存模型深入理解并发...

    Java内存模型详解JMM.docx

    Java内存模型详解JMM.docx

    深入Java内存模型-JMM

    深入Java内存模型-JMM。。。。。。。。。。。。。。。。。。

    java内存模型jmm

    java内存模型jmm

    JMM内存模型的一次记录

    JMM内存模型的一次记录

    jmm模型ppt基本概念介绍

    入门小白概念

    JMM内存模型图解说秒懂

    JMM内存模型图解说秒懂

    三问JMM--有关JVM内存模型的PPT

    有关JVM内存模型的概述,用于对JVM的整体把握从而针对性的学习

    Java内存模型JMM浅析

    Java Memory Model简称JMM, 是一系列的Java虚拟机平台对开发者提供的多线程环境下的内存可见性、是否可以重排序等问题的无关具体平台的统一的保证。(可能在术语上与Java运行时内存分布有歧义,后者指堆、方法区、...

    JMM(Java内存模型)及Volatile底层实现原理.md

    Java内存模型及Volatile底层实现原理

    14、深入理解并发可见性、有序性、原子性与JMM内存模型(1).pdf

    14、深入理解井发可见性、有序性、原子性与JMM内存模型 (1).pdf 15、CPU缓存架构详解&高性能内存队列Disruptor 实战 (1).pdf 16、常用并发设计模式精讲 (1).pdf designpattern.zip disruptor.zip forkjoin.zip jmm(1...

    JMM&JSR;.rar

    Java程序是需要运行在Java虚拟机上面的,Java内存模型(Java Memory Model ,JMM)就是一种符合内存模型规范的,屏蔽了各种硬件和操作系统的访问差异的,保证了Java程序在各种平台下对内存的访问都能保证效果一致的...

    Java面试题03-JMM内存模型之可见性

    微信小程序详细图文教程 泉州大白网络科技 目录 一.微信小程序申请 二....1.申请服务器 2.部署服务器 3.域名申请和配置 三....一....申请,并认证(未认证不能发布,认证需要300元,目前只支持企业认证)详细见官网说明。...

    Java内存模型JMM详解

    主要介绍了Java内存模型JMM详解,涉及volatile和监视器锁,final字段,内存屏障等相关内容,具有一定参考价值,需要的朋友可以了解下。

    JMM(Java 内存模型详解)

    Java开发

    深入理解java内存模型

    本书目录 基础 并发编程模型的分类 Java内存模型的抽象 重排序 ...JMM,处理器内存模型与顺序一致性内存模型之间的关系 JMM的设计 JMM的内存可见性保证 JSR-133对旧内存模型的修补 个人简介 参考文献

    jmm(1).zip

    14、深入理解井发可见性、有序性、原子性与JMM内存模型 (1).pdf 15、CPU缓存架构详解&高性能内存队列Disruptor 实战 (1).pdf 16、常用并发设计模式精讲 (1).pdf designpattern.zip disruptor.zip forkjoin.zip jmm(1...

    浅析java内存模型--JMM(JavaMemoryModel)

    在Java语言中,采用的是共享内存模型来实现多线程之间的信息交换和数据同步的。线程之间通过共享程序公共的状态,通过读-写内存中公共状态的方式来进行隐式的通信。同步指的是程序在控制多个线程之间执行程序的相对...

    java内存模型JMM(Java Memory Model)1

    由于JVM运行程序的实体是线程,而每个线程创建时JVM都会为其创建一个工作内存(有些地方称为栈空间),工作内存是每个线程的私有数据区域,而Java内存模型中规定

Global site tag (gtag.js) - Google Analytics