名师工作室网站建设舟山 做企业网站
web/
2025/10/7 20:45:39/
文章来源:
名师工作室网站建设,舟山 做企业网站,html模板制作,企业网站推广公司什么是线程模型#xff1a;
Java字节码运行在JVM中#xff0c;JVM运行在各个操作系统上。所以当JVM想要进行线程创建回收这种操作时#xff0c;势必需要调用操作系统的相关接口。也就是说#xff0c;JVM线程与操作系统线程之间存在着某种映射关系#xff0c;这两种不同维…什么是线程模型
Java字节码运行在JVM中JVM运行在各个操作系统上。所以当JVM想要进行线程创建回收这种操作时势必需要调用操作系统的相关接口。也就是说JVM线程与操作系统线程之间存在着某种映射关系这两种不同维度的线程之间的规范和协议就是线程模型。 可能有读者会存在疑惑为什么需要这样的中间层我们在开发时直接调用操作系统的接口来创建回收线程不是更直接吗?这个问题的答案显而易见正如我们现在不常用汇编语言进行开发而是使用更加简单容易上手的高级语言一样这是一种自下而上的抽象。 JVM线程对不同操作系统上的原生线程进行了高级抽象使开发者大多数情况下可以不用关注下层细节而只要专注上层开发。不过在学习过程中我们秉持知其然并知其所以然的态度就需要去理解这种抽象方式这也有助于将来我们自己进行一些设计的时候能够复用前人的思想。 理解了什么是线程模型为什么要有线程模型。接下来介绍一下JVM线程模型的三种类型: 一对一多对一多对多。 内核线程
在具体介绍这三种类型之前有必要先来介绍一下操作系统的内核线程本身是什么样的面貌。这里我们就以最主流的Linux内核为例。 有一道面试题非常普遍:“说说线程和进程的区别” 。网上流传的答案之一是“线程属于进程”这个说法是不准确的。Linux线程又被称为“轻量级进程”这就使很多同学摸不着头脑那到底是线程还是进程?我们可以这么去理解“线程” 是抽象概念(KLT 内核线程)因为Linux内部没有专门为线程定义的数据结构和调度算法所以Linux去实现“线程”的方式是“轻量级进程”(LWP, 轻量级进程)本质还是进程。只不过加了一个“轻量级”的修饰词。 “轻量级进程”与“进程”的区别在哪? 一个Linux进程拥有自己独立的地址空间而一个轻量级进程没有自己独立的地址空间只能共享同一个轻量级进程组下的地址空间。进程和轻量级进程的创建都使用clone系统调用区别仅仅在于向clone函数传递的参数不同来指定是否共享地址空间等资源。 明白了Linux内核线程的真面目我们就来讲三种Java线程模型的区别。 一对一
可以看下面这张图一目了然这种线程模型就是在Java线程(用户线程)与操作系统线程(KLT)之间建立一对一的关系这种关系看上去简单粗暴但就是好用。 优点:
每个线程都是独立的调度单元直接利用操作系统内核提供的调度功能。 缺点:
用户线程的阻塞唤醒会直接映射到内核线程上容易引起频繁切换降低性能。但是一些语言引入了CAS来避免一部分的内核调用比如Java引入了AQS这种函数级别的锁减少使用内核级别的锁就能提升性能。
Linux内核能够创建的资源毕竟是有限的所以这在一定程度上会限制并发量。 目前大部分主流JVM.上都是采用的这种线程模型。 UT用户线程; LWP轻量级进程; KLT内核线程 多对一
可以看下面这张图图上多个用户线程映射到一个内核线进程上用户线程的调度需要由用户空间来完成。 优点:
提升并发量上限大部分调度和同步操作都在用户空间内完成减少状态切换能够提升性能。 缺点:
当一个用户线程进行了内核调用并阻塞了那么其他线程在这段时间里都无法进行内核调用。 Java早期版本就是采用的这种线程模型不过后来被抛弃了。 多对多
来看下面这张图。基本上能看得出来这种方式的优点能够解决一对一和多对一模型的缺点综合它们的优点。不过缺点就是要实现这种线程模型难度比较高。 Go语言采用的GMP线程模型就是基于多对多的方式来实现的这也是为什么能够利用goroutine实现更高并发的原因。值得一提的是Java的Loom项目也在进行这方面的探索。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/88680.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!