App*_*rew 12 java multithreading operating-system
据我所知,在进程上下文切换操作系统'备份'寄存器和指令指针(也是寄存器的一部分).
但是如果在进程内的线程之间切换,操作系统会备份完整的寄存器内存和堆栈吗?
我问这个的原因是要了解Java 的volatile关键字在单核处理器的情况下是否有任何意义.
如果Java的volatile关键字在单核处理器的情况下具有任何意义.
jit编译器使用的优化可能会导致意外行为.
static boolean foo = true;
public void bar(){
while(foo){
//doSomething
//do not modify foo in here
}
}
Run Code Online (Sandbox Code Playgroud)
这可能是优化的,因为foo在循环内没有改变.
public void bar(){
while(true){
//Now this loop never ends
//changes to foo are ignored
}
}
Run Code Online (Sandbox Code Playgroud)
决策foo volatile会告诉JIT编译器foo可以通过不同的线程和访问改为它不应该被优化.
这是有效的行为,因为只保证跨线程访问可以使用
更新
volatile关键字本身不会影响上下文切换,但它会影响变量的读写操作.这不仅影响cpu缓存的使用(对于多核系统很重要),而且还影响正常编译器使用的优化(如上所述)(在所有系统上都很重要).