指令重排序问题
来源:2-4 条件语句

背道驰的时光
2018-03-27
请问老师go语言里是否存在指令重排序呢?grade(score int) 目前是没有左边界的,并发访问grade(20)是否可能先执行了 case <= 100直接返回A呢 ?如果存在指令重排序,对于变量在多线程下的赋值是否存在类似volatile的关键字来避免指令重排序?
在Java中我做了实验,值匹配为第一个case并且break,其他case抛异常并且不退出,没有试出在多线程情况下重排序的问题,请问java中我的实验可能由于重排序抛异常吗直接退出吗?
在google的过程中发现了 go memory model 这样的词汇,不是很清楚这一块儿是不是很大的一块儿,在课程目录里没有发现类似的字眼,请问老师课程里会涉及这个吗?
1回答
-
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,涉及了指令重排,并且做了重排的演示。112018-04-04
相似问题