Multithread之为什么spinlock必须是volatile?

 1、编译器的优化

  在本次线程内,当读取一个变量时,为提高存取速度,编译器优化时有时会先把变量读取到一个寄存器中;以后再取变量值时,就直接从寄存器中取值;
  当变量值在本线程里改变时,会同时把变量的新值copy到该寄存器中,以便保持一致
  变量在因别的线程等而改变了值,该寄存器的值不会相应改变,从而造成应用程序读取的值和实际的变量值不一致
  当该寄存器在因别的线程等而改变了值,原变量的值不会改变,从而造成应用程序读取的值和实际的变量值不一致
 
 2、如果spinlock为非volatile,那么当一个线程释放spinlock时,另一个线程就永远无法发现spinlock内存中的值已经被改变。
  
 3、使用volatile可以指定变量每次均从内存中读取,避免编译器优化导致的问题。
  
 可以参考 objc4 项目中的 ARRSpinLock。
05-11 10:57