`
backend-develop
  • 浏览: 24687 次
社区版块
存档分类
最新评论

Java线程知识拾遗

    博客分类:
  • Java
阅读更多

知识回顾

进程与线程是常常被提到的两个概念。进程拥有独立的代码段、数据空间,线程共享代码段和数据空间,但有独立的栈空间。线程是操作系统调度的最小单位,通常一个进程会包含一个或多个线程。多线程和多进程都可以实现并发处理,如 nginx 使用多进程方式、tomcat 使用多线程方式、Apache 支持混合使用。在 C/C++ 等语言中可以同时使用多进程和多线程,而在 Java 中只能使用多线程。

在 Java 中,创建线程的唯一方式是创建 Thread 类的实例,调用实例的 start() 方法启动线程。

 

Java 线程实现

在 JDK 1.2 之前,Java 使用用户线程实现 Java 线程,在 JDK 1.2 及之后,Java 基于操作系统原生的线程模型实现 Java 线程。

使用用户线程( User Thread, UT ) 实现,是指线程建立在用户态空间,线程的建立、同步、调度与销毁都在用户态完成,进程与用户线程之间是1 : N 的对应关系。这种情况下,内核无法知道有多少个用户线程,实现较为复杂。

使用内核线程实现,是指基于轻量级进程( Light Weight Process, LWP ) 来实现线程。每个轻量级进程都有一个内核线程( Kernel-Level Thread, KLT ) 支持,与内核线程之间是 1 : 1 的对应关系。这种情况下,调度线程时可能需要在内核态和用户态之间进行切换。由于轻量级进程需要消耗内核资源,能够支持的线程数量是有限的。

如在 Windows 和 Linux 系统中,操作系统原生的线程模型是 1 : 1 的对应关系,对于 Sun JDK 来说,一个 Java 线程就对应着一个轻量级进程。

 

线程调度与状态

在 Java中线程的调度方式是抢占式调度,即由系统来负责各个线程的时间分配,并在线程使用完分配的时间后调度下一个线程。任何一个线程都不能独占 CPU 。Java 语言一共设置了 10 个线程优先级,当两个线程同时等待执行时,优先级高的先被调度。线程的优先级会被映射到操作系统原生线程上去,但各个操作系统的优先级划分不完全一样,因此两个优先级不同的 Java 线程在操作系统中执行时也可能处于相同的优先级。

Java 定义了 5 种线程状态,分别是新建 ( New )、运行 ( Running )、等待 ( Waiting )、限期等待 ( Timed Waiting )、阻塞 ( Blocked ) 和结束 ( Terminated )。任一时刻,线程都处于 5 种状态中的一种,并在各个状态之间切换,如图所示。

 

其中,各个状态含义如下:

新建:创建后未启动;

运行:对于 Java 来说,线程已经运行,但对于操作系统来说,可能在运行或等待;

等待:线程等待被其他线程唤醒,如调用了 wait、join 且没有指定超时时间;

限期等待:线程等待一段时间后被系统唤醒,如调用了 sleep、wait、join 并设置了超时时间;

阻塞:线程进入同步区域需要与其他线程协调同步,如需要进入 synchronized 区域但其他线程尚未退出此区域;

结束:run 方法执行完成后,线程结束。

 

虚拟机栈

在 Java 内存模型中,每个虚拟机线程都有自己私有的虚拟机栈。栈与线程同时创建,其中存储的是线程的栈帧 ( Stack Frame )。每个方法的调用,都对应着一个栈帧的入栈和出栈。在栈帧中,存储着局部变量表 ( Local Variable Table )、操作栈 ( Operand Stack )、动态连接 ( Dynamic Linking )、返回地址 ( Return Address ) 和其他附加信息。

 

线程的工作内存

在内存模型中,Java 要求所有的变量都必须存储在主内存中,每个线程拥有自己的工作内存。工作内存中保存了线程需要读写的变量的主内存的副本。线程对变量的读写操作都在工作内存中直接进行,并不会去操作主内存中的内容,主内存与工作内存的同步由虚拟机完成。不同线程不能访问彼此的工作内存,变量值的传递需要经过主内存才能完成。

Volatile 修饰的变量可以保证变量对所有线程可见,即某个线程修改变量后,其他线程总能立刻读到新值。即便如此,多线程并发时,对 volatile 变量进行自增自减操作也不能保证线程安全。

 

总结

线程在 Java 中只能通过创建 Thread 类的实例来创建。在 JDK 1.2 之后,Java 中的线程基于操作系统原生的线程模型来实现线程。线程的调度方式是抢占式调度,即由系统来负责各个线程的时间分配,并在线程使用完分配的时间后调度下一个线程。Java 定义了 5 种线程状态:新建、运行、等待、限期等待、阻塞和结束。

每个虚拟机线程都有自己私有的虚拟机栈。栈与线程同时创建,其中存储的是线程的栈帧。每个方法的调用,都对应着一个栈帧的入栈和出栈。每个线程拥有自己的工作内存,工作内存中保存了线程需要读写的变量的主内存的副本。线程对变量的读写操作都在工作内存中直接进行,并不会去操作主内存中的内容,主内存与工作内存的同步由虚拟机完成。

每周 3 篇学习笔记或技术总结,面向有一定基础的 Java 程序员,内容涉及 Java 进阶、虚拟机、MySQL、NoSQL、分布式计算、开源框架等多个领域。关注作者或微信公众号 backend-develop 第一时间获取最新内容。

 

原文地址:Java线程知识拾遗

0
0
分享到:
评论

相关推荐

    Java多线程知识点总结

    了解线程池的概念也是Java多线程编程中的一个重要知识点。线程池是一种多线程处理形式,它将线程和任务的概念分离开来,能够有效管理线程资源,减少线程创建和销毁的开销,提高程序性能。Java中可以通过Executors类...

    线程 JAVA java线程 java线程第3版 java线程第2版第3版合集

    电子书相关:包含4个有关JAVA线程的电子书(几乎涵盖全部有关线程的书籍) OReilly.Java.Threads.3rd.Edition.Sep.2004.eBook-DDU Java Thread Programming (Sams) java线程第二版中英文 java线程第二版中英文 ...

    java 线程工具类 java 线程工具类

    java 线程工具类 java 线程工具类java 线程工具类 java 线程工具类java 线程工具类 java 线程工具类java 线程工具类 java 线程工具类java 线程工具类 java 线程工具类java 线程工具类 java 线程工具类java 线程工具...

    Java线程知识总结

    Java线程知识是Java开发中不可或缺的部分,尤其在构建高性能、高并发的应用程序时显得尤为重要。线程允许程序在同一时间处理多个任务,提高了CPU的利用率和程序的响应速度。 在Java中,线程是由Java虚拟机(JVM)...

    java线程.pdf

    根据提供的信息,我们可以推断出这份文档主要关注的是Java线程的相关内容。下面将围绕“Java线程”这一主题展开详细的介绍与解释。 ### Java线程基础 ...希望以上内容能够帮助您更好地掌握Java线程的相关知识。

    Java线程状态流转图

    Java线程状态流转图知识点总结 Java线程状态流转图是一种用于描述Java线程生命周期中不同的状态和状态转换的图形表示方式。该图形展示了Java线程从创建到终止的整个生命周期,并详细介绍了每种状态的特点和转换...

    java线程知识详解

    Java线程是Java编程语言中的一个关键概念,它允许程序同时执行多个任务,极大地提高了程序的并发性...而《Java Threads》等专业书籍和相关教程则能提供更详尽的理论知识和实践经验,帮助开发者深入探究Java线程的奥秘。

    java线程知识书籍

    ### Java线程基础知识详解 #### 一、引言 随着计算机技术的发展,多核处理器已成为标准配置,使得并发编程变得更加重要。Java作为一种广泛使用的编程语言,内置了对线程的支持,使得开发者能够轻松地实现多任务...

    Java线程(第三版)

    这本书详细介绍了Java线程的各个方面,包括基础知识、高级特性以及实战应用。 在Java中,线程是通过`Thread`类或实现`Runnable`接口来创建的。基础知识点包括如何启动线程、线程的状态(新建、就绪、运行、阻塞和...

    Java多线程知识点思维导图

    对Java线程总体知识的梳理,主要描述了关键知识点,可以梳理一下思路!

    JAVA中的线程知识点整理

    以下是对Java线程相关知识点的详细说明: 1. **线程的创建与执行** - 创建线程有两种方式:继承`Thread`类或者实现`Runnable`接口。继承`Thread`直接重写`run()`方法,而实现`Runnable`接口则需要提供一个包含业务...

    java 线程 dump 分析工具 2.3.3

    java 线程Dump 分析工具: Java的TDA线程转储分析器是一个用于分析Sun Java VM生成的线程转储和堆信息的小型Swing GUI(目前用1.4测试)。它从提供的日志文件中解析线程转储和类直方图。它提供关于发现的线程转储的...

    java 线程相关工具类

    java 线程相关工具类.java 线程相关工具类.java 线程相关工具类.java 线程相关工具类.java 线程相关工具类.java 线程相关工具类.java 线程相关工具类.java 线程相关工具类.java 线程相关工具类.java 线程相关工具类....

    java线程深入解析

    本文将深入解析Java线程的相关知识点,包括线程的定义、创建、状态管理、线程同步和安全问题。 1. **线程定义** 在Java中,线程是进程中的单一顺序控制流,是程序执行的基本单元。线程在进程的上下文中运行,共享...

    Java线程使用教程

    Java线程是Java编程语言中的一个核心概念,它允许程序同时执行多个任务,极大地提高了程序的并发性和效率。本教程将深入探讨Java线程的...阅读提供的"Java线程.pdf"和"说明.txt"文件将帮助你更深入地掌握这些知识点。

    Java线程知识深入解析

    掌握Java线程的知识不仅包括线程的创建、状态转换和调度,还包括同步和通信机制,如`synchronized`关键字、`wait()`, `notify()`, `notifyAll()`方法,以及`Lock`接口和`Condition`对象等。理解这些概念对于编写高效...

    java线程入门级书籍

    ### Java线程入门知识点详解 #### 一、Java线程基础知识概述 **1.1 什么是线程?** 线程是程序执行流的最小单元,是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。在Java中...

    JAVA线程学习(源代码)

    总的来说,"JAVA线程学习(源代码)"涵盖了Java线程的基础知识和高级特性,包括线程的创建、管理、同步和通信。通过分析和实践这些源代码,你可以深入了解Java并发编程的精髓,提高你的多线程编程能力。

    java线程文档大全

    这份“java线程文档大全”包含了关于Java线程的广泛知识,以下是其中的一些关键点: 1. **线程概念**:线程是程序执行的最小单位,每个线程都有自己的程序计数器、寄存器和局部变量,共享同一块内存空间。在Java中...

    Java多线程知识点整理.pdf

    Java多线程知识点整理.pdf

Global site tag (gtag.js) - Google Analytics