java - 线程上下文切换是如何完成的?

标签 java multithreading operating-system

据我了解,在进程上下文切换中,操作系统“备份”寄存器和指令指针(也是寄存器的一部分)。

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

我问这个的原因是为了了解 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/

相关文章:

Java FX 如何 'Stop'线程中途并重新启动它或销毁它

linux - 如何在Linux中说明使用较小的进程nice值?

Java Scanner try catch 多种数据类型

java - 在新线程中创建 JFrame(new messageloog)

java - java中的正则表达式麻烦

java - Swing JPanel - 绘制的图形复制而不是移动

c++ - 为什么要将 mutex 作为参数传递给线程调用的函数?

c - 操作系统 : implementing process IDs

operating-system - 在每种情况下,最大文件大小是多少?

java - 使用 javax.mail 发送邮件时出现 java.lang.VerifyError