JUC并发编程 线程运行原理 -- 多线程 & 上下文切换

Posted Z && Y

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JUC并发编程 线程运行原理 -- 多线程 & 上下文切换相关的知识,希望对你有一定的参考价值。

1. 多线程运行原理

测试代码:

public class TestFrames {
    public static void main(String[] args) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                method1(20);
            }
        }, "t1").start();

        method1(10);
    }

    private static void method1(int x) {
        Object m = method2();
        System.out.println("x = " + x);
        System.out.println("m = " + m);
    }

    private static Object method2() {
        return new Object();
    }
}

我们先打在2个线程运行的地方打上断点:

然后选择debug 注意: 这里选择的是Thread

debug结果:

结论:

  • 每个线程都有自己独立的栈内存,互不干扰,这就是多线程运行原理

2. 上下文切换原理

上下文切换原理概述:

因为以下一些原因导致 cpu 不再执行当前的线程,转而执行另一个线程的代码:

  • 线程的 cpu 时间片用完(被动)
  • 垃圾回收(被动)
  • 有更高优先级的线程需要运行(被动)
  • 线程自己调用了 sleep、yield、wait、join、park、synchronized、lock 等方法(主动)

当 Context Switch 发生时,需要由操作系统保存当前线程的状态,并恢复另一个线程的状态,Java 中对应的概念就是程序计数器(Program Counter Register),它的作用是记住下一条 jvm 指令的执行地址,是线程私有的:

  • 状态包括程序计数器、虚拟机栈中每个栈帧的信息,如局部变量、操作数栈、返回地址等
  • Context Switch 频繁发生会影响性能

上下文切换原理图解

注意: 在切换时会保存原线程的信息



以上是关于JUC并发编程 线程运行原理 -- 多线程 & 上下文切换的主要内容,如果未能解决你的问题,请参考以下文章

JUC并发编程 线程运行原理 -- 栈帧 & 栈帧图解

JUC并发编程 多线程设计模式 -- 同步模式之保护性暂停(join方法原理 & 保护性暂停-扩展-解耦等待和生产)

JUC并发编程 多线程设计模式 -- 同步模式之顺序控制( 固定运行顺序 & 交替输出)

多线程进阶=>JUC并发编程

JUC并发编程 -- park & unpark 基本使用及原理

一篇神文就把java多线程,锁,JMM,JUC和高并发设计模式讲明白了