java多线程并行执行命令_深入理解Java多线程与并发框(第④篇)——重排序、屏障指令、as-if-serial规则...

![](http://img.blog.itpub.net/blog/2020/03/24/906435fda570a5e3.png?x-oss-process=style/bb)

# 一、重排序

前篇文章已经讲了Java内存模型和与其三个特性:原子性、可见性、有序性。但事实上,为了提升程序的执行性能,编译器 和 处理器 常常会对程序指令序列进行 重排序。

重排序分为以下几种:

- 编译器优化重排序

- 处理器重排序

- 指令级并行重排序

- 内存系统重排序

# 二、屏障指令

fence

内存屏障(Memory Barrier,或称为内存栅栏,Memory Fence)是一种CPU指令,用于控制特定条件下的重排序和内存可见性问题。Java编译器也会根据内存屏障的规则在一定程度地禁止重排序。

# 三、as-if-serial 语句

>重排序也不能毫无规则,否则语义就变得不可读, as-if-serial语句 给重排序戴上紧箍咒,起到约束作用。

**as-if-serial语句**规定重排序要满足以下两个规则:

- 在单线程环境下不能改变程序执行的结果;

- 存在数据依赖关系代码(指令)片段的不允许重排序。

比如下面的代码:

```

int a = 1;

// ①

int b = 2;

// ②

int c = a + b;

// 依赖于 ① 和 ②

return c;

```

可能会被优化成:

```

int b = 2;

// ②

int a = 1;

// ①

int c = a + b;

// 依赖于 ① 和 ②

return c;

```

上述的重排序既没有改变单线程下程序运行的结果,又没有对存在依赖关系的指令进行重排序。

# 四、happens-before 规则

产生的背景是为了确保多线程操作下具有内存可见性。

如果一个操作执行的结果需要对另一个操作可见,那么这两个操作之间必须要存在happens-before关系。换句话说,操作1 happens-before 操作2,那么操作1的结果是对操作2可见的。

这里提到的两个操作既可以是在一个线程之内,也可以是在不同线程之间。

**规则**:

1. 程序顺序规则:一个线程中的每个操作,happens-before 于该线程中的任意后续操作

2. 监视器锁规则:对一个锁的解锁,happens-before 于随后对这个锁的加锁

3. volatile变量规则:对一个volatile域的写,happens-before 于任意后续对这个volatile域的读

4. 传递性:如果A happens-before B,且B happens-before C,那么A happens-before C

5. start规则:如果线程A执行操作ThreadB.start()(启动线程B),那么A线程的ThreadB.start()操作happens-before于线程B中的任意操作

6. join规则:如果线程A执行操作ThreadB.join()并成功返回,那么线程B中的任意操作happens-before于线程A从ThreadB.join()操作成功返回。

# 总结:

as-if-serial 语句保证单线程环境下不能改变程序执行的结果,happens-before 规则保证多线程环境下不能改变程序执行的结果。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/69964492/viewspace-2682230/,如需转载,请注明出处,否则将追究法律责任。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/573045.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端必备切图ps篇

前言:当设计师通过photoshop工具设计完设计稿导出psd文件时,我们前端工程师该如何进行切图转换成网页的所需的图片呢,接下来讲讲如何利用photoshop工具快速简洁的切图,因为ps工具用到的行业很多,涉及到的各个行业&…

jquery ajax mysql登录_ajax基础知识、用ajax做登录页面、用ajax验证用户名是否可用、ajax动态调用数据库...

1.ajax的基础知识ajax是结合了jquery、php等几种技术延伸出来的综合运用的技术,不是新的内容。ajax也是写在如果使用ajax一定是要有1个处理页面的,处理页面只是操作数据库并且返回值,页面都是ajax处理的。ajax的写法:test.php1 2 …

jenkins配置记录(2)--代码发布流程

在我们的日常运维工作中,使用jenkins来完成业务代码发版上线是至关重要的一环。前面已经提到在jenkins上添加用户权限的操作,今天重点说下如何在jenkins下构建项目工程进行代码发布? 在此简单介绍下jenkins进行代码发布的流程(根据…

ril.java_RIL.java里request流程

Android GSM驱动模块(rild)详细分析(二)request流程熊猫哥哥 发表于IT168和Opendroid 转载请注明1. 多路复用I/O机制的运转上文说到request是接收,是通过ril_event_loop中的多路复用I/O,也对初始化做了分析.现在我们来仔细看看这个机制如何运转.ril_event_set负责配置一个event…

hibernate优化笔记(随时更新)

一:优化配置 1.关联映射的配置:对照之前的博客,如:inverse属性的设置(减少对同一对象的多条update语句):在one端设置为true,只会执行一次update语句 2.级联cascade属性设置:全部或部分设置为级联 如设置为sava-update(级联更新),当进行保存或更新时,会级联保存所有的关联映射的…

oracle 布尔转换java布尔_java 布尔值一种赋值方法

解决在配置Oracle数据库连接错误问题项目开发使用的Oracle,但是使用了不同的版本的Oracle数据库.然后自己在电脑上安装了2个连接客户端,版本分别是: 10.2.0 12.1.0 用Toad for Oracle 9.0的时候,我 ...XSS跨站脚本小结XSS漏洞验证经常遇到一些过滤,如何进行有效验证和绕过过滤呢…

ASP.NET Request.UrlReferrer 问题

ASP.NET Request.UrlReferrer 作用: 官网解释:Gets information about the URL of the clients previous request that linked to the current URL. 获取 到达当前页面之前的URL信息 此Request.UrlReferrer 容易为null, 当第一次打开当前页面…

联合查询(查找所有分类及其父类)

//查找所有分类及其父类SELECT s.type_id, s.type_name, p.type_name FROM 表1 AS s LEFT JOIN 表2 AS p ON s.parent_id p.type_id; 转载于:https://www.cnblogs.com/dengyg200891/p/6030484.html

autoitv3点击windows界面

在自动化测试过程中会遇到如下windows安全认证,需要输入账号和密码,这个认证对话框不属于element元素。无法用selenium操作,需要用autoitv3操作,输入账号密码后,再进行web元素操作。 有2中方式: 第一种&…

java ftp上传文件_jaVA使用FTP上传下载文件的问题

为了实现 FTP上传下载,大概试了两个方法sun.net.ftp.FtpClientorg.apache.commons.net一开始使用sun.net.ftp.FtpClient,结果发现唯一的问题是它不可以创建目录,随后试了下org.apache.commons.net,创建目录倒是没有问题,不过用FTPClient 的storeFile方法存储文件的时候发现文本…

【转载】linux环境下tcpdump源代码分析

linux环境下tcpdump源代码分析 原文时间 2013-10-11 13:13:02 CSDN博客原文链接 http://blog.csdn.net/han_dawei/article/details/12615199主题 Tcpdump 源码分析作者:韩大卫 吉林师范大学tcpdump.c 是tcpdump 工具的main.c, 本文旨对tcpdump的框架有简单了解&a…

java 扩展接口_详解常用的Spring Bean扩展接口

前言Spring是一款非常强大的框架,可以说是几乎所有的企业级Java项目使用了Spring,而Bean又是Spring框架的核心。Spring框架运用了非常多的设计模式,从整体上看,它的设计严格遵循了OCP----开闭原则,即:1、保…

会话控制(session、cookie)

1.session(1)session存储在服务器的(2)session每个人存一份(3)session有默认的过期时间(4)session里面可以存储任意类型的数据安全,对服务造成压力用法:1.当一个页面需要使用session的时候,需要在页面顶部加session_start();2.操作session 赋…

java 批量提交_【INSERT】逐行提交、批量提交及极限提速方法

在Oracle数据库中,不是提交越频繁越好。恰恰相反,批量提交可以得到更好的性能。这篇文章给大家简单展示一下在Oracle数据库中逐行提交于批量提交两者之间的性能差别。最后再给出一种可以极大改变性能的方法。1.创建表t_ref,并初始化880992条数…

自动化测试索引

转自:http://www.cnblogs.com/zhangfei/p/5454682.html 自动化测试全聚合 UI自动化测试:1.基础API:http://www.cnblogs.com/zhangfei/p/3158223.html2.数据驱动:http://www.cnblogs.com/zhangfei/p/5390091.htmlhttp://www.cnblog…

java中p.name_spring如何使用命名空间p简化bean的配置

这篇文章主要介绍了spring如何使用命名空间p简化bean的配置,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下一般情况下,我们是这么配置bean的:说明:cars是公用的集合Bean&…

Codeforces Round #148 (Div. 2)

A. Two Bags of Potatoes 枚举倍数。B. Easy Tape Programming (待补)C. Not Wool Sequences 考虑前缀异或和。\[answer \prod_{i1}^{n}{2^m-i}\]D. Boring Partition \(a_i\)从小到大排序,以某个\(i\)为分界点,考虑各种情况的最…

c盘java文件误删_C盘爆满怎么办,教你有选择性删除文件,恢复空间

有很多朋友说电脑c盘有很多垃圾,占着空间,还导致电脑响应变慢。还不知道能不能删除,很困扰。那么c盘文件都是什么文件呢?哪些能删除,做一次全面的清理呢?下面给大家介绍一下program Date:系统文…

SSAS parent/child dimension

ex: EmployeeKey ParentEmployeeKey FullName . 给层级命名: ParentEmployeeKey-->Properties--> NameTemplate 定义层级名称 . Browse中如果想看到FullName,EmployeeKey-->Properties-->NameColumn: FullName . 上层member不显示在下一层&…

java向另一activity输入_Activity经典实例一:两个Activity传递数据和对象

1、概述:Activity类直接或者间接地继承了Context、ContextWrapper、ContextThemeWrapper等基类,因此Activity可以直接调用它们的方法。创建一个Activity需要实现某些方法,常见的是实现onCreate(Bundle status)方法,该方法将会在Ac…