据我了解,在进程上下文切换中,操作系统“备份”寄存器和指令指针(也是寄存器的一部分)。
但是如果在进程内的线程之间切换,操作系统会备份整个寄存器内存和堆栈吗?
我问这个的原因是为了了解 Java 的 volatile 关键字在单核处理器的情况下是否有任何意义。
最佳答案
if the volatile keyword of Java is of any significance in case of single core processors.
jit 编译器使用的优化可能会导致意外行为。
static boolean foo = true;
public void bar(){
while(foo){
//doSomething
//do not modify foo in here
}
}
这可以优化,因为 foo 在循环中没有改变。
public void bar(){
while(true){
//Now this loop never ends
//changes to foo are ignored
}
}
making foo
volatile
会告诉 jit 编译器 foo
可以被不同的线程改变并且对它的访问不应该被优化。
这是有效的行为,因为跨线程访问只能保证与
一起工作- volatile 和 synchronized 关键字
- 声明为线程安全的类(例如 java.util.concurrent.*)
更新
volatile 关键字不会影响上下文切换本身,但会影响变量读写的优化方式。这不仅会影响 cpu 缓存的使用(对多核系统很重要),还会影响即时编译器使用的优化,如上所示(对所有系统都很重要)。
关于java - 线程上下文切换是如何完成的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4569338/