Java中的并发模型

深入学习Java基础知识
2022-05-27 15:58 · 阅读时长2分钟
小课

在Java中使用多线程非常方便,但是你有没有想过Java中的多线程是怎么管理的,线程的调度是由谁来负责,有什么样的策略呢?今天介绍一些Java中的并发模型。

原生线程(Native Thread)

在这种模型中,Java中的线程与JVM所运行的操作系统中的线程对应,我们对Thread的操作最终由JVM映射为对操作系统中对应线程的操作,也就是说JVM就像一个中间层,我们调用Thread API,然后JVM去调用操作系统的API,这样做的原因主要是操作系统拥有更多的权限,它能够更加合理的运用多核CPU的优势,将不同线程映射到不同的CPU执行。从JDK1.2开始这就成为了Java多线程模型的标准实现。

绿色线程(Green Thread)

在这个模型中,Java中的线程不再是直接映射到操作系统的线程,但是这些Java线程最终也是通过操作系统的线程去执行,所以Java中的线程与操作系统的线程还是存在某种关联,而如何进行关联,这完全可以由JVM决定,比如说运行n个操作系统线程,然后将m个Java线程与之关联,可能一个操作系统关联一个,也可能关联多个,如果一个操作系统线程关联多个Java线程就可能需要对这多个Java线程进行调度分配执行时间。

这样做的好处是可以减少操作系统线程的创建,从而提高效率,有点类似于更底层的线程池,不过话说回来,我们在Java中使用线程池也可以避免多次创建线程造成的开销。在JDK1.2之前,Java曾经使用过这种多线程模型。

轻量级线程 Lightweight Thread

Project Loom是Java中的轻量级线程实现,它的模式与Green Thread相似,没将自己的线程直接映射到操作系统的线程,它与Green Thread最大的不同是任务调度机制,Green Thread是抢占式线程调度,也就是说线程的执行时间,线程本身是无法直接控制的。而Project Loom则是协同式线程调度,也就是说线程的执行时间由线程本身来控制,线程把自己的工作执行完了之后要主动发信号,然后执行下一个线程。

虽然Project Loom目前还没有正式发布到JDK中,但是在Java 13已经开始进入实验(experimental)阶段。

java线程模型绿色线程轻量级线程