Java 多线程

变量可见性

在多线程程序中,当一个线程对共享变量所做的修改对于其它线程并不可见,导致其它的线程仍然使用错误的值,就会造成可见性问题。

  • 在代码被运行时,对于一条代码语句,可能对应着虚拟机中多条的指令序列,由于CPU在调用线程时不可预知,那么就可能出现在执行某一条语句时,执行到其所对应的指令的间隙就切换到了其它线程执行,引发错误。

  • 现在的CPU一般采用多级缓存,多级缓存的引入是为了提高读取效率,增加CPU运算的性能,但是这样也会引发一些问题:由于线程在读取数据的时候是从主存时读取的,当一个线程对一个共享变量进行了修改的时候,这个变量没有及时地写入到主存中,而是暂时保存在了缓存中,那么CPU此时切换另一个线程运行时,读取到的时主存的原来的值。

  • 另一个可能的原因是编译器出于对性能的考虑,可能会对生成的字节吗进行指令重排,优化指令的执行顺序,这也可能会引发多线程可见性问题。