Java线程----实现篇

本篇是Java线程系列的第一篇,后两篇地址如下
Java线程----调度篇
Java线程----安全篇

线程

线程是比进程更轻量级的调度执行单位,线程的引入,可以把一个进程的资源分配和执行调度分开,各个线程既可以共享进程资源,又可以独立调度。

线程的实现

实现线程主要有3种方式:使用内核线程实现、使用用户线程实现和使用用户线程加轻量级进程混合实现。

  1. 使用内核线程实现
    内核线程(Kernel-Level Thread,KLT)就是直接由操作系统内核支持的线程,并负责将线程的任务映射到各个处理器上。
    程序一般不会直接去使用内核线程,而是去使用内核线程的一种高级接口------轻量级进程(Light WerghtProcess, LWP),轻量级进程就是我们通常意义上所讲的线程,由于每个轻量级进程都由一个内核线程支持,因此只有先支持内核线程,才能有轻量级进程。这种轻量级进程与内核线程之间1:1的关系称为一对一的线程模型
    轻量级进程和普通进程的区别在于:
    前者没有独立的用户空间(内核态线程无用户空间,用户态线程共享用户空间),而普通进程有独立的内存空间;轻量级进程只有一个最小的执行上下文和调度程序所需的统计信息
    轻量级进程和普通线程的区别在于:
    与线程相比,轻量级进程有它自己的进程标识符,优先级,状态,以及栈和局部存储区,并和其他进程有着父子关系

  2. 使用用户线程实现
    从广义上来讲,一个线程只要不是内核线程,就可以认为是用户线程(User Thread, UT),因此,从定义上来讲,轻量级进程也属于用户线程,但轻量级进程的实现始终是建立在内核之上的,许多操作都要进行系统调用,效率会受到限制。
    从狭义上的用户线程是指的是完全建立在用户空间的线程库上,系统内核不能感知线程存在的实现。
    用户线程的建立、同步、销毁和调度完全在用户态中完成,不需要内核帮助。
    这种进程与用户之间1:N的关系称为一对多的线程模型

  3. 使用用户线程加轻量级进程混合实现
    在这种混合实现下,既存在用户线程,也存在轻量级进程。操作系统提供支持轻量级进程作为用户线程和内核线程之间的桥梁,这样可以使内核提供的线程调度功能及处理器映射,并且用户线程的系统调用要通过轻量级进程来完成,大大降低了整个进程被完全阻塞的风险。
    这种混合模式中,用户线程和轻量级进程的数量比不确定,即为N:M,这种就是多对多线程模型

那么Java线程的实现方式是怎样的呢?

JDK1.2之前,是基于称为“绿色线程”的用户线程实现的,而在JDK1.2中,线程模型替换为基于操作系统原生线程模型来实现。

因此,在目前的JDK版本中,操作系统支持怎样的线程模型,在很大程度上决定了Java虚拟机的线程是怎样映射的,在不同的平台没有办法达成一致。

线程模型只对线程的并发规模和操作成本产生影响,对Java程序的编码和运行过程来说,这些差异都是透明的。

常用操作系统Windows和Linux系统提供的现场模型都是一对一的,即内核线程。
基本上我们开发中Java线程的实现方式都是内核线程,而 程序一般不会直接去使用内核线程,而是去使用内核线程的一种高级接口------轻量级进程(Light WerghtProcess, LWP),但是轻量级进程具有它的局限性:

  1. 由于是基于内核线程实现的,所以线程操作、如创建、析构及同步,都需要进行系统调用。而系统调用的代价相对较高,需要在用户态和内核态中来回切换;

  2. 每个轻量级进程都需要一个内核线程的支持,因此轻量级进程要消耗一定的内核资源,因此一个系统支持轻量级进程的数量是有限的。

思考:
为什么要对同步锁进行优化,偏向、轻量级,添加自旋等?

通过上面的介绍,可以大致知道其中一条原因就是Java在目前的主流操作系统上都是使用内核线程方式来实现线程的,线程的创建等操作都是建立在内核上的,通过轻量级进程的局限性可知,频繁的阻塞唤醒线程代价是高昂的,所以Java对同步锁进行优化,这就是原因之一。打个比方,比如锁的自旋,很多时候一条线程很快就会释放掉持有的锁资源,而此时另一条线程访问时,锁资源尚未释放,就马上进行阻塞,这样的阻塞行为就过于频繁,很浪费资源,所以采用自旋的方式,让线程暂时“忙起来”,这样避免频繁阻塞而浪费资源。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值