前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java的JVM是如何实现多线程的?

Java的JVM是如何实现多线程的?

作者头像
程序员阿杜
发布2021-08-03 15:49:41
1.1K0
发布2021-08-03 15:49:41
举报
文章被收录于专栏:开源君

Java线程模型

文章已同步至GitHub开源项目: Java超神之路

​ 并发不一定都要用到线程,比如PHP中用到的是多进程。但是在Java中并发基本上都是使用线程来实现的。我们先来看看线程在Java虚拟机中是如何实现的。

线程的实现

​ 主流的操作系统都提供了线程的实现,Java线程则提供了在不同硬件和操作系统下对线程的统一处理。每个已经start且并未结束的Thread类的实例对象都是一个线程。

​ 我们查看Thread的JDK源码,发现所有的方法都被native修饰。也就是说,Thread是使用平台相关的手段来实现的。在不同的操作系统或者硬件平台都有不同的实现。因此,标题为线程的实现,而不是Java线程的实现

​ 实现线程主要有三种方式

  • 内核线程 (1:1线程模型)
  • 用户线程 (1:N 线程模型)
  • 用户线程 + 轻量级进程 混合 (N:M 线程模型)
  1. 内核线程的实现 ​ 内核线程(Kernel-Level Thread,KLT)是由操作系统内核直接支持的线程 。这种线程由内核来完成线程切换。内核通过操纵调度器对内核线程进行控制,并负责将线程的任务映射到各个处理器。 ​ 程序一般不会直接使用内核线程,而是使用它的高级接口:轻量级进程(LWP)。轻量级进程就是我们通常意义上讲的线程。每个轻量级进程都由一个内核线程支持。因此这种方式称为1:1的线程模型

​ 由于内核线程的支持,每个轻量级进程都是一个独立的调度单元。由于是基于系统内核实现的,所以此种方式在对线程进行创建,同步等操作的时候都需要系统内核调用。需要在用户态和系统内核态之间频繁切换,影响性能。

  1. 用户线程的实现 ​ 用户线程指完全建立在用户态的线程库中,用户线程的创建,同步,销毁,调度等操作完全在用户态中完成,不需要在频繁切换内核态。因此速度很快。很多高性能的数据库中的多线程就是用的用户线程。 ​ 由于是一个进程对应多个用户线程,因此,线程模型是1:N的

缺点:

  • 由于所有的线程操作都需要由用户处理,所以线程的创建,销毁,切换,调度都是用户需要考虑的问题。
  • 由于操作系统只将处理器的资源分配到进程程度,所以阻塞如何处理,多处理器如今分配资源等问题都需要由用户解决。

Java,Ruby等语言都使用过用户线程,但是最终都放弃了。

  1. 用户线程 + 轻量级进程 混合实现 ​ 在这种情况下,既存在用户线程,又存在轻量级进程,用户线程的建立还是在用户态中,因此不需要频繁切换内核态,保证了速度的高效。轻量级进程为用户线程和内核线程的桥梁。这样可以使用内核提供的线程调度功能处理用户线程中存在的问题。用户线程和轻量级进程的比例是不确定的。因此是N:M的线程模型

Java线程的实现

​ Java规范中并没有具体要求使用哪种方式来实现

​ 在JDK1.2之前,使用一种绿色线程的用户线程来实现的。

​ JDK1.3之后,普遍采用内核线程来实现,也就是1:1的线程模型。

​ 以市场占有率最大的HotSpot虚拟机来举例,它的每一个线程都是直接映射到操作系统的原生线程来实现的。中间没有额外的结构,所有的线程调度都是由操作系统完成的,虚拟机全权交给操作系统处理。

​ 操作系统支持什么样的线程模型,很大程度上会影响在此系统上的虚拟机的选择。所以在JVM规范中,不会限定使用哪种线程模型。由于Thread类对底层的规范统一,对于上层的Java应用来说,底层的差异都是透明的。只要面向Thread类进行编程就好了。

​ 这也间接的符合了设计原则中的依赖倒置原则

文章已同步至GitHub开源项目: Java超神之路 更多Java相关知识,欢迎访问!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-08-01 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Java线程模型
  • 线程的实现
  • Java线程的实现
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档