Java多线程模型

简介: 谈到Java多线程就涉及到多线程的模型及Java线程与底层操作系统之间的关系。正如我们熟知,现代机器可以分为硬件和软件两大块,如图2-5-1-1,硬件是基础,软件提供实现不同功能的手段。

谈到Java多线程就涉及到多线程的模型及Java线程与底层操作系统之间的关系。正如我们熟知,现代机器可以分为硬件和软件两大块,如图2-5-1-1,硬件是基础,软件提供实现不同功能的手段。而且软件可以分为操作系统和应用程序,操作系统专注于对硬件的交互管理并提供一个运行环境给应用程序使用,应用程序则是能实现若干功能的并且运行在操作系统环境中的软件。同样,线程按照操作系统和应用程序两层次可以分为内核线程(Kernel Thread)和用户线程(User Thread)。
 
图2-5-1-1
所谓内核线程就是直接由操作系统内核支持和管理的线程,线程的建立、启动、同步、销毁、切换等操作都由内核完成。基本所有的现代操作系统都支持内核线程。用户线程指完全建立在用户空间的线程库上,由内核支持而无需内核管理,内核也无法感知用户线程的存在,线程的建立、启动、同步、销毁、切换完全在用户态完成,无需切换到内核。可以把用户线程看成是更高层面的线程,而内核线程则是最底层的支持,那么他们之间必然存在一定的映射关系,一般有三种常用的关系,下面将逐个列出。
① 一对一模型
一对一模型可以说是最简单的映射模型,如图2-5-1-2,KT为内核线程,UT为用户线程,每个用户线程都对应一个内核线程,由于每个用户线程都有各自的内核线程,所以他们互不影响,即使其中一个线程阻塞,也允许另一个线程继续执行,这无疑是此模型的优点,但也存在一个严重的缺陷,由于一对一的关系,有多少个用户线程就代表有多少个内核线程,而内核线程的开销较大,一般操作系统都会有内核线程数量的限制,用户线程的数量也被限制。
 
图2-5-1-2
② 多对一模型
第二种是多对一模型,如图2-5-1-3,可以清晰看到多个用户线程映射到同一个内核线程上,可以看成由一条内核线程实现若干个用户线程的并发功能,线程的管理在用户空间中进行,一般不需要切换到内核态,效率较高,而且比起一对一模型,支持的线程数量更大。但此模型有个致命的弱点是如果一个线程执行了阻塞调用,所有线程都将阻塞,并且任意时刻只能有一个线程访问内核。另外,对线程的所有操作都将由用户应用自己处理。所以一般除了在不支持多线程的操作系统被迫使用此模型外,在多线程操作系统中基本不使用。
 
图2-5-1-3
③ 多对多模型
多对多模型的提出是为了解决前面两种模型的缺点,如图2-5-1-4,多个用户线程与多个内核线程映射形成多路复用。前面提到的一对一模型存在受内核线程数量限制的问题,多对一模型虽然解决了数量限制问题,但它存在一个线程阻塞导致所有线程阻塞的风险,而且由于一个内核线程只能调度一个线程导致并发性不强。看看多对多模型如何解决这些问题,由于多对一是多对多的子集,所以多对多具备多对一的优点,线程数不受限制。除此之外,多个内核线程可处理多个用户线程,当某个线程阻塞时,将可以调度另外一个线程执行,这从另一方面看也是增强了并发性。
 
图2-5-1-4

三种模型各自有各自的特点,不同的现代操作系统可能使用不同的线程模型,例如linux和windows可能使用了一对一模型,而solaris和unix某些版本可能使用多对多模型。对于线程的创建和管理主要由线程库提供用户级别和内核级别两种API进行操作。用户级别由于不涉及内核操作,所有代码和数据结构均存放在用户空间,与此相反,内核级别由内核支持,将直接调用内核系统操作,代码和数据结构存在与内核空间中。在实际程序中我们一般不直接使用内核线程,用户线程与内核线程直接需要一种中间数据结构,它由内核支持且是内核线程的高级抽象,这个高级接口被称为轻量级进程(Light Weight Process),下面简称LWP。图2-5-1-5是三种模型增加了轻量级进程的示意图,从某种层面上看,LWP最多算是广义的用户线程,并非狭义定义的用户进程,LWP线程库是以内核为基础,很多操作要进行内核调用,效率不高,如果要快速低消耗的操作则需要一个纯粹的用户线程,线程库完全建立在用户空间。于是可以看到一个进程P里面一般包含若干个用户进程,用户进程以某种关系对应轻量级进程,而轻量级进程则是内核线程的高级体现。如此一来,一个内核线程堵塞将导致LWP也阻塞,与LWP相连的用户线程也将阻塞。


图2-5-1-5

最后要谈谈Java线程与底层操作系统的关系,由于Java通过JVM封装了底层操作系统的差异,所以Java线程也必然是要封装不同操作系统提供一个统一的并发定义,在JDK发展历史上,java语言开发者曾经通过一类叫“绿色线程(Green Threads)”的用户线程进行实现Java线程,但从jdk1.2开始,java线程使用操作系统原生线程模型实现,也就是说Java线程的实现通过不同操作系统提供的线程库分别实现,JVM根据不同操作系统的线程模型对Java线程进行映射,假如Java运行在windows系统上,它通常直接使用Win32 API实现多线程,假如Java运行在linux系统则直接使用Pthread线程库实现多线程。这样一来就顺利隐藏了底层实现细节,提供给开发者就是一个具有统一抽象的线程语义。



点击订购作者书籍《Tomcat内核设计剖析》




目录
相关文章
|
4天前
|
Java 程序员 开发者
深入理解Java并发编程:线程同步与锁机制
【4月更文挑战第30天】 在多线程的世界中,确保数据的一致性和线程间的有效通信是至关重要的。本文将深入探讨Java并发编程中的核心概念——线程同步与锁机制。我们将从基本的synchronized关键字开始,逐步过渡到更复杂的ReentrantLock类,并探讨它们如何帮助我们在多线程环境中保持数据完整性和避免常见的并发问题。文章还将通过示例代码,展示这些同步工具在实际开发中的应用,帮助读者构建对Java并发编程深层次的理解。
|
4天前
|
Java
Java并发编程:深入理解线程池
【4月更文挑战第30天】本文将深入探讨Java并发编程中的一个重要主题——线程池。我们将从线程池的基本概念入手,了解其工作原理和优势,然后详细介绍如何使用Java的Executor框架创建和管理线程池。最后,我们将讨论一些高级主题,如自定义线程工厂和拒绝策略。通过本文的学习,你将能够更好地理解和使用Java的线程池,提高你的并发编程能力。
|
2天前
|
存储 缓存 前端开发
Java串口通信技术探究3:RXTX库线程 优化系统性能的SerialPortEventListener类
Java串口通信技术探究3:RXTX库线程 优化系统性能的SerialPortEventListener类
11 3
|
2天前
|
Java
JAVA难点包括异常处理、多线程、泛型和反射,以及复杂的分布式系统知识
JAVA难点包括异常处理、多线程、泛型和反射,以及复杂的分布式系统知识。入坑JAVA因它的面向对象特性、平台无关性、强大的标准库和活跃的社区支持。
11 2
|
2天前
|
Java 调度 开发者
Java中的多线程编程:基础与实践
【5月更文挑战第2天】本文将深入探讨Java中的多线程编程,从基础概念到实际应用,为读者提供全面的理解和实践指导。我们将首先介绍线程的基本概念和重要性,然后详细解析Java中实现多线程的两种主要方式:继承Thread类和实现Runnable接口。接着,我们将探讨线程同步的问题,包括synchronized关键字和Lock接口的使用。最后,我们将通过一个实际的生产者-消费者模型来演示多线程编程的实践应用。
|
2天前
|
安全 Java 程序员
Java中的多线程编程:从理论到实践
【5月更文挑战第2天】 在计算机科学中,多线程编程是一项重要的技术,它允许多个任务在同一时间段内并发执行。在Java中,多线程编程是通过创建并管理线程来实现的。本文将深入探讨Java中的多线程编程,包括线程的概念、如何创建和管理线程、以及多线程编程的一些常见问题和解决方案。
11 1
|
3天前
|
存储 安全 Java
深入理解Java并发编程:线程安全与性能优化
【5月更文挑战第1天】本文将深入探讨Java并发编程的核心概念,包括线程安全和性能优化。我们将详细分析线程安全问题的根源,以及如何通过合理的设计和编码实践来避免常见的并发问题。同时,我们还将探讨如何在保证线程安全的前提下,提高程序的并发性能,包括使用高效的同步机制、减少锁的竞争以及利用现代硬件的并行能力等技术手段。
|
3天前
|
并行计算 Java 数据处理
Java中的多线程编程:基础知识与实践
【5月更文挑战第1天】本文将深入探讨Java中的多线程编程,包括其基本概念、实现方式以及实际应用。我们将从理论和实践两个角度出发,详细解析线程的创建、启动、控制以及同步等关键问题,并通过实例代码演示如何在Java中有效地使用多线程。
|
3天前
|
Java 程序员
Java中的多线程编程:从理论到实践
【5月更文挑战第1天】 在现代计算机科学中,多线程编程是一个重要的概念,它允许程序员在同一程序中并行运行多个任务。Java作为一种广泛使用的编程语言,提供了一套丰富的多线程编程工具。本文将介绍Java中多线程编程的基本概念,包括线程的创建、启动、控制和同步,以及一些常见的多线程问题和解决方案。
|
3天前
|
存储 Java 程序员
Java中的多线程编程:基础知识与实践
【5月更文挑战第1天】在现代计算机科学中,多线程是一种重要的并行计算技术,允许多个执行流程并发运行。本文将深入探讨Java语言中的多线程编程,从基础概念到实际应用,帮助读者理解多线程的核心原理,并通过实例学习如何在Java中创建和管理线程。我们将涵盖线程的生命周期、同步机制以及如何利用高级类如Executor框架来优化多线程应用的性能。通过本文的学习,读者将具备设计和实现高效、稳定多线程Java应用程序的能力。
6 2