指令级并行特殊实现:字段拷贝至栈的作用相关咨询
相关实现代码
final long s0 = this.s0; long s1 = this.s1; final long result = s0 + s1; s1 ^= s0; this.s0 = Long.rotateLeft(s0, 24) ^ s1 ^ s1 << 16; this.s1 = Long.rotateLeft(s1, 37); return result;
你说的结论是完全成立的,这么设计的核心目的之一就是利用指令级并行提升执行效率,具体原因如下:
- 首先,类字段存储在堆内存中,属于多线程共享的可变状态,CPU执行时默认需要考虑其他线程修改该字段的可见性问题,直接操作类字段的话,所有计算指令都会强绑定字段的读取结果,无法做乱序执行优化。而拷贝到栈上的局部变量是线程私有数据,不存在被其他线程修改的可能,编译器和CPU都可以明确这些值的变更只会受当前执行流控制,自然切断了和外部其他操作的依赖关系。
- 其次看这段代码的逻辑,返回值
result只和刚拷贝的s0、s1初始值有关,后续的状态更新运算(异或、循环移位、字段回写)和result的计算没有任何依赖链路。CPU的多发射、指令重排机制会自动识别这种无依赖的指令序列,完全可以在准备好result用于返回的同时,并行在后台执行剩余的状态更新操作,不需要等所有状态都写入完成再返回,充分压榨CPU的执行资源。
如果不做栈拷贝直接操作类字段,编译器无法随意优化字段读取次数,甚至可能需要额外插入内存屏障保证可见性,反而会引入不必要的依赖,彻底堵死指令级并行的优化空间。
内容的提问来源于stack exchange,提问作者sulljason
相关产品推荐
相关产品推荐

