动力节点首页 全国咨询热线:400-8080-105

绑定手机号,登录
手机号

验证码

微信登录
手机号登录
手机号

验证码

30天自动登录
微信登录与注册
微信扫码登录与注册

扫码关注微信公众号完成登录与注册
手机号登录
首页 > 文章

解析3种线程的实现

05-26 14:31 341浏览
举报 T字号
  • 大字
  • 中字
  • 小字

我们都知道Java语言实现并发是需要依赖于多线程的。众所周知,线程比进程更加轻量级,它将进程的资源分配和执行调度分开,各个线程既可以共享进程资源,又可以独立调度。在Java语言中,线程是程序调度的最小单元(不过在未来如果Java成功引入纤程的话,这一点可能会被改变)。

站在计算机系统的角度来看,线程实现的方式主要有3种:使用内核线程实现(1:1)、使用线程实现(1:N)、混合实现(N:M)。

1.内核线程实现

内核线程是直接由操作系统内核控制的,内核通过调度器来完成内核线程的调度并负责将其映射到处理器上执行。内核态下的线程执行速度理论上是最高的,但是用户不会直接操作内核线程,而是通过内核线程的接口——轻量级进程来间接的使用内核线程。这种轻量级进程就是所谓的线程。

由于每一个线程都需要一个内核线程支持,因此内核线程和线程在数量是1:1的。故内核线程实现的方式也被称为1:1实现。

【优点】由于内核线程的支持,每一个线程都是一个独立的单元,因此就算某一个线程挂掉了,也不会导致整个进程挂掉。

【缺点】但是这种实现方式也存在局限性。由于是基于内核线程实现的,所以当涉及到线程的操作时(创建、运行、切换等)就涉及到系统调度,而系统调度则会导致用户态和内核态之间的来回切换,代价是比较昂贵的。

用户态和内核态切换的代价主要体现在响应中断、保护和恢复线程执行现场的成本。 程序的运行需要上下文的支撑,这里的上下文从不同的角度来看,代表的含义是不一样的。 从程序员的角度来看:方法调用的各种变量和资源; 从线程的角度来看:方法调用栈锁存储的各种信息; 从系统的角度来看:存储在寄存器、内存中的各个具体的数据。 当涉及到线程切换时,系统需要把当前线程执行的各种数据快照保存起来,这里面就涉及到数据在缓存、内存中来回拷贝等,之后还需要恢复即将执行的线程的上下文环境,因此它的代价是比较昂贵的!

2.用户线程实现

从广义的角度来看,只要不是内核线程都可以被看做是用户线程,因此轻量级进程也可以被看做是用户线程,但是轻量级进程始终是建立在内核线程上的,所以轻量级进程不具备通常意义上的用户线程所具备的优势。

而狭义的用户线程则是完全建立在用户空间的线程库,系统内核是无法感知到这些用户线程的存在。用户线程的创建、运行、调度等管理层面的操作都是在用户态下完成的,不需要内核的帮助。 【优点】由于不需要内核的帮助,这意味着如果操作得当,就可以不用切换到内核态,在这种情况下系统消耗相对低很多,可以更加轻松的实现更大规模的线程并发。现在,很多高性能数据库中的多线程就是基于用户线程实现的。这种进程与用户线程之间1:N的关系也被称为一对多实现模型。 【缺点】用户线程的优点在于不需要内核,其缺点也在于此。由于没有内核的帮助,对于线程的调度需要用户自行实现。而线程调度本身需要考虑的东西太多,因此对于用户而言实在是太复杂,搞不好就会导致线程阻塞从而引起系统崩溃。

在以前,Java、Ruby等语言也尝试使用用户线程,但最终都放弃了。近几年,以并发闻名于耳的编程语言Go、Erlang则使用的是用户线程。现在我们知道Go、ErLang语言天生支持高并发的本质原因了。

3.混合实现

混合实现中既有用户线程也有轻量级进程实现,他们的数量关系是不定的,因此也叫做N:M实现。在这种情况下,我们既可以享受用户线程带来的低消耗的好处,也能享受到内核线程在线程调度上的优势,在提升线程并发的同时,大大降低了线程阻塞的风险。

以上就是Java中的三种线程的实现方式,我们在实际开发中可以根据不同的需求来实现不同的线程,当然我们还需要更多的实际操作经验,这一点可以在动力节点在线的免费视频课程中学习到,感兴趣的小伙伴千万不要错过。

0人推荐
共同学习,写下你的评论
0条评论
代码小兵498
程序员代码小兵498

153篇文章贡献528999字

相关课程 更多>

作者相关文章更多>

推荐相关文章更多>

Java面试题及答案整理

代码小兵66904-21 20:01

6道经典算法面试题

杨晶珍05-12 16:39

简述Spring MVC的核心组件

代码小兵49806-11 16:26

SpringMVC 中的组件

代码小兵49806-11 16:28

Spring常见面试题

代码小兵92504-17 16:07

发评论

举报

0/150

取消