主页 > 开源代码  > 

Java并发编程6--重排序

Java并发编程6--重排序
重排序是指 编译 器和 处 理器 为 了 优 化程序性能而 对 指令序列 进 行重新排序的一种手段。 1.数据依赖性  如果两个操作 访问 同一个 变 量,且 这 两个操作中有一个 为 写操作,此 时这 两个操作之 间就存在数据 依赖性。 数据依赖的类型

上面 3 种情况,只要重排序两个操作的 执 行 顺 序,程序的 执 行 结 果就会被改 变 编译 器和 处 理器在重排序 时 ,会遵 守数据依赖 性, 编译 器和 处 理器不会改 变 存在数据依 赖 关系的 两个操作的 执 行 顺 序。 数据依 赖 性 仅针对单 个处理器中执行的指令序列和单个线程中执 行的操作, 不同处 理器之 间 和不同线程之 间 的数据依 赖 性不被 编译 器和 处 理器考 虑 。 2.as-if-serial语义  as-if-serial语义 的意思是:不管怎么重排序( 编译 器和 处 理器 为 了提高并行度),( 单线 程) 程序的 执 行 结 果不能被改 变 。 编译 器、 runtime 和 处 理器都必 须 遵守 as-if-serial 语义 。 在 计 算机中, 软 件技 术 和硬件技 术 有一个共同的目 标 :在不改 变 程序 执 行 结 果的前提下, 尽 可能提高并行度。 在不影响程序执行结果,保证数据依赖性的情况下,有些重排序是可以允许的。JMM会认为 这种重排序并不非法(not illegal),JMM允许这种重排序。 3.重排序对多线程程序的影响 在 单线 程程序中, 对 存在控制依 赖 的操作重排序,不会改 变执 行 结 果( 这 也是 as-if-serial语义允 许 对 存在控制依 赖 的操作做重排序的原因); 但在多 线 程程序中, 对 存在控制依 赖 的操作重排序,可能会改变程序的执 行 结 果。
标签:

Java并发编程6--重排序由讯客互联开源代码栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“Java并发编程6--重排序