wordpress 本地建站教程,长沙做网站哪家公司好,深圳百度快照优化,wordpress 登陆样式目录 一、概述
二、final域的重排序规则
三、写final域的重排序规则
四、读final域的重排序规则
五、final域为引用类型 一、概述 与锁和volatile相比#xff0c;对final域的读和写更像是普通的变量访问。下面将介绍final域的内存语义。 final比volatile的强度弱一些…目录 一、概述
二、final域的重排序规则
三、写final域的重排序规则
四、读final域的重排序规则
五、final域为引用类型 一、概述 与锁和volatile相比对final域的读和写更像是普通的变量访问。下面将介绍final域的内存语义。 final比volatile的强度弱一些轻量级的volatile。
二、final域的重排序规则 对于final域编译器和处理器要遵守两个重排序规则。 1在构造函数内对一个final域的写入与随后把这个被构造对象的引用赋值给一个引用变量这两个操作之间不能重排序。 2初次读一个包含final域的对象的引用与随后初次读这个final域这两个操作之间不能重排序。 下面通过一些示例性的代码来分别说明这两个规则
public class FinalExample {int i; // 普通变量final int j; // final变量static FinalExample obj;public FinalExample () { // 构造函数i 1; // 写普通域j 2; // 写final域}public static void writer () { // 写线程A执行obj new FinalExample ();}public static void reader () { // 读线程B执行FinalExample object obj; // 读对象引用int a object.i; // 读普通域int b object.j; // 读final域}
} 这里假设一个线程A执行writer()方法随后另一个线程B执行reader()方法。通过这两个线程的交互可以说明这两个规则。
三、写final域的重排序规则 写final域的重排序规则禁止把final域的写重排序到构造函数之外。这个规则的实现包含下面2个方面。 1JMM禁止编译器把final域的写重排序到构造函数之外。 2编译器会在final域的写之后构造函数return之前插入一个StoreStore屏障。这个屏障禁止处理器把final域的写重排序到构造函数之外。 写final域的重排序规则可以确保在对象引用为任意线程可见之前对象的final域已经被正确初始化过了而普通域不具有这个保障。
四、读final域的重排序规则 读final域的重排序规则是在一个线程中初次读对象引用与初次读该对象包含的final域JMM禁止处理器重排序这两个操作注意这个规则仅仅针对处理器。编译器会在读final域操作的前面插入一个LoadLoad屏障。初次读对象引用与初次读该对象包含的final域这两个操作之间存在间接依赖关系。由于编译器遵守间接依赖关系因此编译器不会重排序这两个操作。大多数处理器也会遵守间接依赖也不会重排序这两个操作。但有少数处理器允许对存在间接依赖关系的操作做重排序比如alpha处理器这个规则就是专门用来针对这种处理器的。 reader()方法包含3个操作。 初次读引用变量obj。 初次读引用变量obj指向对象的普通域j。 初次读引用变量obj指向对象的final域i。
五、final域为引用类型 对于引用类型写final域的重排序规则对编译器和处理器增加了如下约束在构造函数内对一个final引用的对象的成员域的写入与随后在构造函数外把这个被构造对象的引用赋值给一个引用变量这两个操作之间不能重排序。