当前位置: 首页 > news >正文

「JVM 高效并发」Java 线程

进程是资源分配(内存地址、文件 I/O 等)的基本单位,线程是执行调度(处理器资源调度)的基本单位;

Loom 项目若成功为 Java 引入纤程(Fiber),则线程的执行调度单位可能变为纤程;

在 Java 里实现并发基本都是基于线程的;

文章目录

      • 1. 线程的实现
      • 2. Java 线程调度
      • 3. 状态转换

1. 线程的实现

Java 语言提供了不同硬件和操作系统平台下对线程操作的统一处理;每个调用过 start() 且还未结束的 java.lang.Thread 类的实例代表一个线程;

  • Native 方法,没有使用或无法使用平台无关的手段来实现,或者为了执行效率使用 Native 方法;

线程实现的三种方式

  • 内核线程实现(1:1 实现),(Kernel-Level Thread,KLT),直接由操作系统内核支持的线程;由内核完成线程切换,内核通过调度器(Scheduler)进行线程调度,并将线程任务映射到各个处理器上;(支持多线程的内核称为多线程内核);
    • 轻量级进程Light Weight Process,LWP),内核线程的高级接口,通常意义上的线程,每个轻量级进程由一个内核线程支持;

请添加图片描述

局限性:每个线程操作(创建、析构、同步)都需要进行系统调用,需要在用户态和内核态之间来回切换,代价较高;消耗一定的内核资源(内核线程的占空间),系统支持轻量级进程的数量是有限的

  • 用户线程实现(1:N 实现),(User Thread,UT),广义上的用户线程指所有非内核线程的线程;狭义上的用户线程指完全建立在用户空间的线程库上,系统内核不能感知到存在和如何实现的线程;

若程序实现得当,用户线程不需要切换到内核态,操作可以非常快速且低消耗,能支持规模更大的线程数量(如部分高性能数据库中的多线程);

局限性:没有系统内核的支援,所有线程操作(创建、销毁、切换、调度)都需要用户程序自己处理,阻塞处理、线程映射到处理器等问题的处理非常复杂,导致用户线程的视线通常比较复杂;

除了有明确需求(不支持多线程的操作系统下的多线程程序),一般应用程序不倾向使用用户线程,Java、Ruby 等语言都曾经使用并弃用用户线程;但近年来一些以高并发为买点的新语言(Golang、Erlang 等)又普遍支持了用户线程;

请添加图片描述

  • 混合实现(N:M 实现),将内核线程与用户线程一起使用的实现方式(UNIX 系列系统如 Solaris、HP-UX 等提供了混合线程模型);

请添加图片描述

用户线程建立在用户空间,线程的创建、切换、析构等操作廉价,可支持大规模的用户线程并发;

操作系统支持的轻量级进程作为用户线程和内核线程的桥梁,可以使用内核的线程调度及处理器映射,大大降低了整个进程被阻塞的风险;

Java 线程的实现

JDK 1.2 以前的 Classic VM 是基于绿色线程Green Threads)实现的;JDK 1.3 起,商用 JVM 的线程普遍以内核线程实现;

HotSpot VM 的每一个线程直接映射到一个操作系统原生线程来实现,中间没有额外的间接结构,HotSpot 不会去干涉线程调度(可设置线程优先级给操作系统提供调度建议;何时冻结、何时唤醒线程、给线程分配多少处理器执行时间、把线程安排给哪个处理器核心执行等,都是操作系统全权负责的);

两个例外

  • Java ME 的 CLDC HotSpot Implementation(CLDC-HI)同时支持用户线程实现和混合模型;当 Java 线程执行一个阻塞调用时,CLDC-HI 会为之单独开一个内核线程,然后调度执行其他 Java 线程;
  • Solaris 平台的 HotSpot VM 支持内核线程实现(通过 Bound threads 或 Alternate Libthread)和混合模式(通过 LWP/Thread Based Synchronization),通过 -XX:UseLWPSynchronization(默认)和 -XX:+UseBoundThreads 指定;

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

2. Java 线程调度

  • 线程调度,系统为线程分配处理器使用权的过程,主要分为协同式(Cooperative Threads-Scheduling)线程调度和抢占式(Preemptive Threads-Scheduling)线程调度;

  • 协同式Cooperative Threads-Scheduling)线程调度,线程的执行时间由线程本身控制,由线程主动通知系统切换到另外的线程(Lua 中的协同例程);

    • 实现简单;
    • 没有线程同步问题,切换操作对线程自己是可知的;
    • 线程执行的时间不可控,可能会导致整个系统一直阻塞在一个线程中;
  • 抢占式Preemptive Threads-Scheduling)线程调度,每个线程由系统来分配执行时间,线程的切换不由线程本身决定(Java 的 Thread::yield 可以主动让出执行时间,但不能主动获取执行时间);

    • 不会有一个线程导致整个进程阻塞的问题;
    • 即使进程出现问题,也不会影响到整个操作系统;

线程优先级可以给操作系统一些线程调度建议,但并不是一项稳定的调优手段;不同操作系统的不同优先级会变得相同,且系统可能自行改变优先级(根据现场执行频率);

3. 状态转换

Java 语言定义的 6 中线程状态

  • 新建(New),创建后尚未启动的线程;
  • 运行(Runnable),正在执行的线程、正在等待操作系统为它分配执行时间的线程(包括操作系统线程状态中的 Running 和 Ready);
  • 无限期等待(Waiting),等待被其他线程显示唤醒的线程,该线程不会被操作系统分配处理器时间;
    • Object::wait(),没有设置 timeout 参数;
    • Thread::join(),没有设置 timeout 参数;
    • LockSupport::park();
  • 限期等待(Timed Waiting),在一定时间后自动由系统唤醒,该线程不会被操作系统分配处理器时间;
    • Thread::sleep();
    • Object::wait(),设置了 timeout;
    • Thread::join(),设置了 timeout;
    • LockSupport::parkNanos();
    • LockSupport::parkUntil();
  • 阻塞(Blocked),线程被阻塞,在等待获得一个排它锁(在另一个县城放弃这个锁时发生);程序在等待进入一个同步区域;
  • 结束(Terminated),已终止的线程;线程已经结束执行;

请添加图片描述


上一篇:「JVM 高效并发」Java 内存模型

PS:感谢每一位志同道合者的阅读,欢迎关注、评论、赞!


参考资料:

  • [1]《深入理解 Java 虚拟机》

相关文章:

「JVM 高效并发」Java 线程

进程是资源分配(内存地址、文件 I/O 等)的基本单位,线程是执行调度(处理器资源调度)的基本单位; Loom 项目若成功为 Java 引入纤程(Fiber),则线程的执行调度单位可能变为…...

ADAS-可见光相机之Cmos Image Sensor

引言 “ 可见光相机在日常生活、工业生产、智能制造等应用有着重要的作用。在ADAS中更是扮演着重要的角色,如tesla model系列全车身10多个相机,不断感知周围世界。本文着重讲解下可见光相机中的CIS(CMOS Image Sensor)。” 定义 光是一种电磁波&…...

【ESP 保姆级教程】玩转emqx MQTT篇③ ——封装 EmqxIoTSDK,快速在项目集成

忘记过去,超越自己 ❤️ 博客主页 单片机菜鸟哥,一个野生非专业硬件IOT爱好者 ❤️❤️ 本篇创建记录 2023-02-26 ❤️❤️ 本篇更新记录 2023-02-26 ❤️🎉 欢迎关注 🔎点赞 👍收藏 ⭐️留言📝🙏 此博客均由博主单独编写,不存在任何商业团队运营,如发现错误,请…...

Python自动化测试面试题-编程篇

前言 随着行业的发展,编程能力逐渐成为软件测试从业人员的一项基本能力。因此在笔试和面试中常常会有一定量的编码题,主要考察以下几点。 基本编码能力及思维逻辑基本数据结构(顺序表、链表、队列、栈、二叉树)基本算法&#xf…...

CIT 594 Module 7 Programming AssignmentCSV Slicer

CIT 594 Module 7 Programming Assignment CSV Slicer In this assignment you will read files in a format known as “comma separated values” (CSV), interpret the formatting and output the content in the structure represented by the file. Q1703105484 Learning …...

链路追踪——【Brave】第一遍小结

前言 微服务链路追踪系列博客,后续可能会涉及到Brave、Zipkin、Sleuth内容的梳理。 Brave 何为Brave? github地址:https://github.com/openzipkin/brave Brave是一个分布式追踪埋点库。 #mermaid-svg-riwF9nbu1AldDJ7P {font-family:"…...

Vision Transformer(ViT)

1. 概述 Transformer[1]是Google在2017年提出的一种Seq2Seq结构的语言模型,在Transformer中首次使用Self-Atttention机制完全代替了基于RNN的模型结构,使得模型可以并行化训练,同时解决了在基于RNN模型中出现了长距离依赖问题,因…...

104-JVM优化

JVM优化为什么要学习JVM优化: 1:深入地理解 Java 这门语言 我们常用的布尔型 Boolean,我们都知道它有两个值,true 和 false,但你们知道其实在运行时,Java 虚拟机是 没有布尔型 Boolean 这种类型的&#x…...

QML 颜色表示法

作者: 一去、二三里 个人微信号: iwaleon 微信公众号: 高效程序员 如果你经常需要美化样式(最常见的有:文本色、背景色、边框色、阴影色等),那一定离不开颜色。而在 QML 中,颜色的表示方法有多种:颜色名、十六进制颜色值、颜色相关的函数,一起来学习一下吧。 老规矩…...

基础数据结构--线段树(Python版本)

文章目录前言特点操作数据存储updateLazy下移查询实现前言 月末了,划个水,赶一下指标(更新一些活跃值,狗头) 本文主要是关于线段树的内容。这个线段树的话,主要是适合求解我们一个数组的一些区间的问题&am…...

【micropython】SPI触摸屏开发

背景:最近买了几块ESP32模块,看了下mircopython支持还不错,所以买了个SPI触摸屏试试水,记录一下使用过程。硬件相关:SPI触摸屏使用2.4寸屏幕,常见淘宝均可买到,驱动为ILI9341,具体参…...

【云原生】k8s中Pod进阶资源限制与探针

一、Pod 进阶 1、资源限制 当定义 Pod 时可以选择性地为每个容器设定所需要的资源数量。 最常见的可设定资源是 CPU 和内存大小,以及其他类型的资源。 当为 Pod 中的容器指定了 request 资源时,调度器就使用该信息来决定将 Pod 调度到哪个节点上。当还…...

AI - stable-diffusion(AI绘画)的搭建与使用

最近 AI 火的一塌糊涂,除了 ChatGPT 以外,AI 绘画领域也有很大的进步,以下几张图片都是 AI 绘制的,你能看出来么? 一、环境搭建 上面的效果图其实是使用了开源的 AI 绘画项目 stable-diffusion 绘制的,这是…...

应用场景五: 西门子PLC通过Modbus协议连接DCS系统

应用描述: 西门子PLC(S7200/300/400/200SMART)通过桥接器可以支持ModbusRTU串口和ModbusTCP以太网(有线和无线WIFI同时支持)两种通讯方式连接DCS系统,不需要编程PLC通讯程序,直接在模块中进行地…...

我继续问了ChatGPT关于SAP顾问职业发展前景的问题,大家感受一下

目录 SAP 顾问 跟其他IT工作收入情况相比是怎么样的? 如何成为SAP FICO 优秀的顾问 要想成为SAP FICO 优秀的顾问 ,需要ABA开发技能吗 SAP 顾问中哪个类型收入最多? 中国的ERP软件能够取代SAP吗? 今天我继续撩 ChatGPT。随便问…...

Python小白入门---00开篇介绍(简单了解一下)

Python 小白入门 系列教程 第一部分:Python 基础 介绍 Python 编程语言安装 Python 环境变量和数据类型运算符和表达式控制流程语句函数和模块异常处理 第二部分:Python 标准库和常用模块 Python 标准库简介文本处理和正则表达式文件操作和目录操作时…...

【算法基础】C++STL容器

一、Vector 1. 初始化(定义) (1)vector最基本的初始化: vector <int> a;(2)定义长度为10的vector: vector <int> a(10);(3)定义长度为10的vector,并且把所有元素都初始化为-3: vector <int...

【经典蓝牙】蓝牙 A2DP协议分析

A2DP 介绍 A2DP(Advanced Audio Distribution Profile)是蓝牙高音质音频传输协议&#xff0c; 用于传输单声道&#xff0c; 双声道音乐&#xff08;一般在 A2DP 中用于 stereo 双声道&#xff09; &#xff0c; 典型应用为蓝牙耳机。 A2DP旨在通过蓝牙连接传输高质量的立体声音…...

Objective-C 构造方法的定义和声明规范

总目录 iOS开发笔记目录 从一无所知到入门 文章目录源码中 NSArray 的构造方法与命名规律自定义类的构造方法命名截图代码输出源码中 NSArray 的构造方法与命名规律 interface NSArray<ObjectType> (NSArrayCreation) (instancetype)array;(instancetype)arrayWithObject…...

Matlab图像处理学习笔记

Matlab图像处理 Matlab基础 数组 1、向量 生成方式1: x = [值] x = [1 2 3] % 行向量 y = [4; 5; 6] % 列向量 z = x % 行向量转列向量...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中&#xff0c;我们已经大致实现了rpc服务端的各项功能代…...

【网络安全产品大调研系列】2. 体验漏洞扫描

前言 2023 年漏洞扫描服务市场规模预计为 3.06&#xff08;十亿美元&#xff09;。漏洞扫描服务市场行业预计将从 2024 年的 3.48&#xff08;十亿美元&#xff09;增长到 2032 年的 9.54&#xff08;十亿美元&#xff09;。预测期内漏洞扫描服务市场 CAGR&#xff08;增长率&…...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中&#xff0c;接口是一种抽象类型&#xff0c;它定义了一组方法的集合&#xff1a; // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的&#xff1a; // 矩形结构体…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述&#xff1a;iview使用table 中type: "index",分页之后 &#xff0c;索引还是从1开始&#xff0c;试过绑定后台返回数据的id, 这种方法可行&#xff0c;就是后台返回数据的每个页面id都不完全是按照从1开始的升序&#xff0c;因此百度了下&#xff0c;找到了…...

2024年赣州旅游投资集团社会招聘笔试真

2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

Python爬虫(二):爬虫完整流程

爬虫完整流程详解&#xff08;7大核心步骤实战技巧&#xff09; 一、爬虫完整工作流程 以下是爬虫开发的完整流程&#xff0c;我将结合具体技术点和实战经验展开说明&#xff1a; 1. 目标分析与前期准备 网站技术分析&#xff1a; 使用浏览器开发者工具&#xff08;F12&…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)

前言&#xff1a; 最近在做行为检测相关的模型&#xff0c;用的是时空图卷积网络&#xff08;STGCN&#xff09;&#xff0c;但原有kinetic-400数据集数据质量较低&#xff0c;需要进行细粒度的标注&#xff0c;同时粗略搜了下已有开源工具基本都集中于图像分割这块&#xff0c…...

Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?

Pod IP 的本质与特性 Pod IP 的定位 纯端点地址&#xff1a;Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址&#xff08;如 10.244.1.2&#xff09;无特殊名称&#xff1a;在 Kubernetes 中&#xff0c;它通常被称为 “Pod IP” 或 “容器 IP”生命周期&#xff1a;与 Pod …...