主线程对特定字段所做的更改对于新创建的线程不可见。造成这种现象的主要原因是,JIT编译器可以优化新线程代码中的while循环,因此新线程无法程上下文中看到变量的变化。此外,新线程只能从其寄存器或本地缓存中读取标记变量的值,而不是每次都运行到速度较慢的内存中。由于上述原因,新线程看不到主线程对其标签变量值的更改。

如果您想快速解决此问题,只需将变量标记为已完成即可。

关键字volatile的功能是告诉JIT编译器不要对可能影响其访问顺序的标记变量执行任何优化。此关键字警告JIT编译器该变量可能被线程更改,因此对变量的任何读或写访问都需要忽略本地缓存并直接操作内存。之前我称此更改为快速修复,因为如果我们将所有变量都标记为volatile,尽管可以完全避免这种问题,但它将使每个变量访问都跨越内存障碍,并最终导致程序性能下降。 。另外,在多个线程同时访问多个字段的情况下,由于对每个volatile字段的访问是独立处理的,并且这些访问不能统一为一个访问,因此volatile关键字不能保证整个操作的原子性。此问题的结果是线程可能只看到某些字段的中间结果,而看到其他变量的最终更改结果。

摘要:

由volatile关键字修改的字段将确保内存可见,并且由volatile关键字修改的字段不会重新排列。

本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/shoujiruanjian/article-349896-1.html
有点知识好吗
已经翻了
我是比较含蓄的那一波
让有智慧