关于先行先发生原则的一个问题

先行先发生原则中有一条,程序次序规则:同一个线程内,按照代码出现的顺序,前面的代码先行于后面的代码,准确的说是控制流顺序,因为要考虑到分支和循环结构。

但是有的地方又说,"int j = 2"的代码完全可能先被处理器执行。(《深入理解java虚拟机》 p378)
示例代码如下:
//以下操作在同一个线程中执行
int i = 1;
int j = 2;

这是为什么呢??
#Java工程师#
全部评论
可不可以这样理解: "int j = 2"的代码完全可能先被处理器执行,这并不影响先行先发生原则,因为我们在这条线程中没有办法感知到这点。(都是赋值操作,无论先发生哪一个,最终结果都与顺序执行一样)。 但如果有其他线程在读取这两个值,指令重排序就会造成读取错误!
点赞 回复 分享
发布于 2017-06-29 21:13
这两个数据没有依赖性,所以可以重排序
点赞 回复 分享
发布于 2017-07-03 12:21
虚拟机保证单线程内看到的数据是有序的,因为她们不存在依赖关系,不同执行顺序结果是一样的。但是如果在不同的线程间就不能保证了
点赞 回复 分享
发布于 2017-06-30 08:48
因为数据不存在依赖关系
点赞 回复 分享
发布于 2017-06-30 08:44
因为处理器会因为提高速度而对指令进行重排序呀。
点赞 回复 分享
发布于 2017-06-30 01:22
单独线程内,只要数据不存在依赖关系,编译器和处理器是可以对操作进行重排序的
点赞 回复 分享
发布于 2017-06-29 21:33

相关推荐

买蜜雪也用卷:我觉得应该没有哪个人敢说自己熟练使用git,代码分支一复杂还是得慢慢寻思一下的,不过基本的拉代码提交代码还有分支什么的是应该会
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务