多线程实现及Java Thread

最近看《深入理解Java虚拟机》,它对多线程实现的描述比较清晰,我简单总结整理了一下,写下来以最大程度避免以后再忘了。

首先了解多线程实现前,需要先了解这些线程的概念(进程的概念就不重复了)。
  • 内核线程(Kernel Thread): 操作系统内核完成工作的基本单位,它是运行在内核空间的。内核处理的是中断。当它执行一个任务时,把操作分配给不同的硬件,如CPU,之后它只能通过中断拿回控制权了。内核不存在进程的概念,它是支撑进程实现的。 
  • 用户线程(User Thread): 用户空间的执行调度单元,用户程序自己创建并调度维护的(用户程序只运作在用户空间的程序,不一定是当前程序自己,可能是本地方法库提供的)。
  • Light-weight Process(LWP): 它是一种用户线程,但它与内核线程一对一绑定。在与内核线程一一对应这一点上, LWP和进程类似。但它又不是完整的进程,可以在用户空间与属于同一进程的多线程共享资源,在切换时不像进程一样需要保持完整的上下文。 

了解了上述3种线程后,就可以介绍多线程的3种实现方式了。
  1. 使用LWP实现,使得进程的每一个线程都和一个内核线程对应。这种方式的好处是,线程的创建和调度都交给操作系统来做,用户程序比较简单。当运行在多核系统上时,操作系统可以将这些线程真正并行运行在不同的核心上,获得性能提升。它的缺点是,线程的创建和切换都需要从用户空间转换到内核空间,这会带来不小的开销(用户空间寄存器,栈的保存之类)。另外,这种方式里每个进程可以创建的线程数受系统的资源影响和限制。
  2. 使用普通的用户线程(非LWP)实现,这种实现里多个用户线程只和一个内核线程对应,内核根本不知道用户线程的存在。这种方式里,由于线程的创建和调度都是在用户空间进行的,省去了切换到内核空间的开销。并且,线程个数也不受操作系统限制。它的缺点是,当对应的内核线程被阻塞时,所有的用户线程都无法运行。而当运行在多核系统上时,同一进程的多个线程无法真正做到并行执行。
  3. 混合使用用户线程和LWP,这种实现里进程的多个线程对应的是多个内核线程。它的实现比较复杂,但可以部分的获得上述两种方式的好处,而避免缺陷。

最后回到Java里多线程的实现,Oracle的JVM是基于操作系统支持的内存模型来实现的。比如说Linux上是使用的LWP实现,而Sollaris上可以通过参数选择使用混合模式。据说JDK1.2之前,JVM的实现使用的是称为“Green Threads”的用户线程的实现。

另外提一下POSIX 的Pthread,它是一套公共借口。通过pthread_create()创建的thread是用户线程还是LWP决定于具体实现。如在Linux上是创建的就是LWP.

参考资料:
1. 《深入理解Java虚拟机》第二版 周志明
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值