指令重排序问题

来源:2-4 条件语句

背道驰的时光

2018-03-27

  1. 请问老师go语言里是否存在指令重排序呢?grade(score int) 目前是没有左边界的,并发访问grade(20)是否可能先执行了 case <= 100直接返回A呢 ?如果存在指令重排序,对于变量在多线程下的赋值是否存在类似volatile的关键字来避免指令重排序?

  2. 在Java中我做了实验,值匹配为第一个case并且break,其他case抛异常并且不退出,没有试出在多线程情况下重排序的问题,请问java中我的实验可能由于重排序抛异常吗直接退出吗?

  3. 在google的过程中发现了 go memory model 这样的词汇,不是很清楚这一块儿是不是很大的一块儿,在课程目录里没有发现类似的字眼,请问老师课程里会涉及这个吗?

写回答

1回答

ccmouse

2018-03-29

1. 请问老师go语言里是否存在指令重排序呢?grade(score int) 目前是没有左边界的,并发访问grade(20)是否可能先执行了 case <= 100直接返回A呢 ?如果存在指令重排序,对于变量在多线程下的赋值是否存在类似volatile的关键字来避免指令重排序?
这个取决于语言对switch中各个case顺序的规定。当然是规定了从上到下的。指令重排肯定有,不过不会把这些case重排。至于volatile,go语言的并发模型使得我们对volatile的需求大大降低。标准库里只是提供了一个atomic的数据类型供使用。

2. 在Java中我做了实验,值匹配为第一个case并且break,其他case抛异常并且不退出,没有试出在多线程情况下重排序的问题,请问java中我的实验可能由于重排序抛异常吗直接退出吗?
不可能,因为指令重排不是什么都重排的。case的顺序是规定了的。

3. 在google的过程中发现了 go memory model 这样的词汇,不是很清楚这一块儿是不是很大的一块儿,在课程目录里没有发现类似的字眼,请问老师课程里会涉及这个吗?
这门只是go语言的入门课,所以不会涉及memory model。不过我在另一门java面试的课程中,有一个小节提到了java memory model,涉及了指令重排,并且做了重排的演示。

1
1
背道驰的时光
非常感谢!
2018-04-04
共1条回复

Google资深工程师深度讲解Go语言 由浅入深掌握Go语言

语法+分布式爬虫实战 为转型工程师量身打造

5995 学习 · 1909 问题

查看课程