您的位置:首页 > 编程语言 > Java开发

多线程实现及Java Thread

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

首先了解多线程实现前,需要先了解这些线程的概念(进程的概念就不重复了)。

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

了解了上述3种线程后,就可以介绍多线程的3种实现方式了。

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

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

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

参考资料:

1. 《深入理解Java虚拟机》第二版 周志明

2.https://en.wikipedia.org/wiki/Thread_(computing)

3.https://en.wikipedia.org/wiki/Light-weight_process

4.https://en.wikipedia.org/wiki/POSIX_Threads

5.http://www.thegeekstuff.com/2013/11/linux-process-and-threads/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: