java内存模型与多线程技术

上传人:j7****6 文档编号:61649955 上传时间:2018-12-08 格式:PPT 页数:48 大小:247KB
返回 下载 相关 举报
java内存模型与多线程技术_第1页
第1页 / 共48页
java内存模型与多线程技术_第2页
第2页 / 共48页
java内存模型与多线程技术_第3页
第3页 / 共48页
java内存模型与多线程技术_第4页
第4页 / 共48页
java内存模型与多线程技术_第5页
第5页 / 共48页
点击查看更多>>
资源描述

《java内存模型与多线程技术》由会员分享,可在线阅读,更多相关《java内存模型与多线程技术(48页珍藏版)》请在金锄头文库上搜索。

1、java内存模型与多线程技术,yangjsalibaba-,主要内容和目的,学习java多线程理论基础:JMM(java内存模型) 学习java多线程技术基础:理解同步是如和工作 分析程序什么时候需要同步 澄清对volatile误解,正确使用 Task Cancellation and Thread Shutdown策略 Lazy initialization Safety技术,JMM(java内存模型),什么是Java内存模型 Java内存模型相关概念 java线程和内存交互行为定义 Ordering&visibility JMM相关java语言规范,内存模型,操作平台的内存模型 寄存器,C

2、PU缓存,物理内存,虚拟内存 缓存一致性模型 顺序一致性模型:要求对某处理机所写的值立即进行传播,在确保该值以被所有处理机接受后才能继续其他指令的执行 释放一致性模型:允许将某处理机所写的值延迟到释放锁时进行传播,Java内存模型(JMM),内存存管理的跨平台统一的模型 write-once, run-anywhere concurrent applications in Java 定义了Java线程和内存交互的规则 通过一组语义规则来描述尤其是多线程之间共享内存的模式,保证多线程程序结果的可预测,语义一致 性 不同于其他语言,同平台无关 所有的实例变量,静态变量和数组元素都存放在堆内存里 线

3、程本地变量在堆栈中,不受JMM影响,Java内存模型相关概念,Thread working copy memory 在java规范中这是一个抽象的概念,对应可能会是寄存器,cpu缓存,编译及执行优化等 。 一个新产生的Thread有一个空的working memory。 类似一个高速缓存 线程之间无法相互直接访问,变量传递均需要通过主存完成 The main memory 就是我们所说的java堆内存 Threads execution engine 保证线程的正确执行顺序,java线程和内存交互行为定义,JLS中对线程和主存互操作定义了6个行为,分别为load,save,read,write

4、,assign和use,这些操作行为具有原子性,且相互依赖,有明确的调用先后顺序 A use action (by a thread) transfers the contents of the threads working copy of a variable to the threads execution engine. An assign action (by a thread) transfers a value from the threads execution engine into the threads working copy of a variable. A read

5、 action (by the main memory) transmits the contents of the master copy of a variable to a threads working memory for use by a later load operation. A load action (by a thread) puts a value transmitted from main memory by a read action into the threads working copy of a variable. A store action (by a

6、 thread) transmits the contents of the threads working copy of a variable to main memory for use by a later write operation. A write action (by the main memory) puts a value transmitted from the threads working memory by a store action into the master copy of a variable in main memory.,java线程和内存交互分析

7、,例子分析: class Simple int a = 1, b = 2; /Thread 1 executes void to() a = 3; b = 4; /Thread 2 executes void fro() System.out.println(“a= “ + a + “, b=“ + b); 类似计算机多级存储器结构,Working Memory类似Cache机制 问题:变量a,b何时写会main memory?,Ordering&visibility,程序顺序: 程序声明它们应当发生的顺序 执行顺序:JMM不保证线程对变量操作发生的顺序和被其他线程看到的是同样的顺序。 JMM

8、容许线程以写入变量时所不相同的次序把变量存入主存 线程内部本身遵循程序顺序,从线程外看到的是执行顺序 编译器和处理器可能会为了性能优化,进行重新排序 程序执行为了优化也可能重新排序,Ordering&visibility,多线程场景分析 class Simple int a = 1, b = 2; /Thread 1 executes void to() a = 3; /This can appear to happen second b = 4; / This can appear to happen first /Thread 2 executes void fro() System.ou

9、t.println(“a= “ + a + “, b=“ + b); 下面哪种结果是正确的: a=1, b=2 a=1, b=4 a=3, b=2 a=3 ,b=4,Happens-Before Memory Model,类似释放一致性模型 Partial ordering(happens-before) :如果B能够看到A动作产生的结果,我们说A happens-before B,JMM定义了一些这样的规则,如: Program order rule. Each action in a thread happens-before every action in that thread tha

10、t comes later in the program order. Monitor lock rule. An unlock on a monitor lock happens-before every subsequent lock on that same monitor lock. Volatile variable rule. A write to a volatile field happens-before every subsequent read of that same field ,The rules for happens-before,JMM相关java语言规范,J

11、MM定义了保证内存操作跨线程的正确的Ordering和visibility 方法 Java语言提供的技术和工具 synchronized 块 volatile 变量(在JDK5+的JVM中得到修补) 工具类:java.util.concurrent.locks 原子变量java.util.concurrent.atomic Final变量(在JDK5+的JVM中得到修补),正确的理解synchronized,synchronized 作用说明 Synchronized内存模型语义分析 如何判定多线程的程序何时需要Synchronized 同步需求的JMM内存交互分析练习 锁对象的引用在同步块中

12、发生修改会出现什么? Hostspot JVM的synchronized优化技术 直接使用synchronized 不足之处,synchronized 作用说明,Low level locking 什么时候需要synchronized ? 一个变量有可能被多个线程访问,其中至少有一个线程是写操作 每个对象都有一个相关的lock对象(监视器) java语言没有提供分离的lock和unlock操作 ,但是在JVM提供了两个单独的指令monitorenter和monitorext来实现 特性 Atomicity :Locking to obtain mutual exclusion Visibili

13、ty :Ensuring that changes to object fields made in one thread are seen in other threads(memory) Ordering: Ensuring that you arent surprised by the order in which statements are executed Blocking:Cant interrupt,Synchronized内存模型语义分析,Synchronized:通过对象引用找到同步对象,然后获取对象上的监视器进行锁操作 当线程进入synchronized 块之后首先要做的

14、是清洗 threads working memory, 对块内使用到的变量要么执行assign动作要么对use的变量执行 read-load原子操作从 main memory装载新的值 当线程退出synchronized 块之前,对它在working memory中所有的 assigned values执行 store write原子操作,写回main memory,Synchronized内存模型语义分析,Example: / block until obtain lock synchronized(obj) / get main memory value of field1 and fie

15、ld2 int x = obj.field1; int y = obj.field2; obj.field3 = x+y; / commit value of field3 to main memory / release lock,如何分析多线程并发需求,class SynchSimple int a = 1, b = 2; /Thread 1 executes synchronized void to() a = 3; b = 4; /Thread 2 executes void fro() System.out.println(“a= “ + a + “, b=“ + b); 以下哪种结

16、果是正确的? a=1, b=2 a=1, b=4 a=3, b=2 a=3 ,b=4 这是一个线程安全的类吗? 接下来我们通过JMM语义来分析这个例子,JMM内存交互分析,JMM内存交互分析,SynchSimple 分析: write a 和 write b 在synchronized 规则中并没有规定发生的顺序约束 read a 和 read b. 同样也没有规定发生的顺序 结果说明的什么问题? 对一个方法声明synchronized 并不能够保证这个方法行为产生的结果是一个原子操作,也就是说write a 和 write b 两个操作在main memory不是原子行为,虽然单个都是原子操作。,下面我们做一个练习:,JMM内存交互分析练习,Example: class Foo int a = 1, b = 2; synchronized void to() a = 3; b = 4; synchronized vo

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号