如何完成线程上下文切换?

App*_*rew 12 java multithreading operating-system

据我所知,在进程上下文切换操作系统'备份'寄存器和指令指针(也是寄存器的一部分).

但是如果在进程内的线程之间切换,操作系统会备份完整的寄存器内存和堆栈吗?

我问这个的原因是要了解Java 的volatile关键字在单核处理器的情况下是否有任何意义.

jos*_*efx 7

如果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和synchronized关键字
  • 声明为线程安全的类(例如java.util.concurrent.*)

更新

volatile关键字本身不会影响上下文切换,但它会影响变量的读写操作.这不仅影响cpu缓存的使用(对于多核系统很重要),而且还影响正常编译器使用的优化(如上所述)(在所有系统上都很重要).