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

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

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

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

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务