我们在加了volatile指令修饰后,在汇编代码当中被volatile修饰的变量在被赋值之后会多了一个“lock addl $0x0,(%esp)”操作,这个操作相当于一个内存屏障(指令重排序时不能把后面的指令重排序到内存屏障之前的位置),这里就保证了禁止指令重排。
“lock addl $0x0,(%esp)”操作的含义是将ESP寄存器的值加0,那么有什么意义呢?这里我们就要说一下lock操作了,如果对一个变量执行lock操作,那将会清空工作内存中此变量的值,在执行引擎使用这个变量之前,需要重新执行load(将一个变量值从主内存中放入到工作内存中的副本变量中(备份))或assign(从执行引擎接收到的值赋给工作内存的变量)操作以初始化变量的值,那么这里就保证了变量的可见性。