多线程概念

多线程的概念 线程是操作系统中调度的基本单位,比进程更轻量,因为线程共享进程的内存空间和资源(如代码段、数据段、文件句柄),但每个线程有独立的执行上下文(包括栈、程序计数器和寄存器)。例如,两个线程同时对同一变量递增,可能丢失更新。上下文切换:当线程被切换时,操作系统保存当前线程的上下文(寄存器、栈指针等),加载另一个线程的上下文。进程:操作系统分配资源(如内存、文件句柄)的单位,每个进程有独立的地址空间。在 GUI 应用中,主线程(UI 线程)处理界面绘制和用户输入,后台线程执行耗时任务(如文件下载),避免界面卡顿。 阅读详情

1.同步机制简介

线程同步机制是一套用于协调线程间的数据访问及活动的机制,该机制用于保障线程安全以及实现这些线程的共同目标。

线程同步机制是编程语言为多线程运行制定的一套规则,合理地运用这些规则可以很大程度上保障程序的正确运行。

这套机制包含两方面的内容,一是关于多线程间的数据访问的规则,二是多线程间活动的规则。前者关乎程序运行的正确与否,是相当重要的内容;后者很大程度上是影响程序的运行效率,也是不容忽视的内容。不太严谨地说,数据访问的规则主要是由锁来实现,线程间活动的规则则表现线程调度上。

2.锁

线程安全问题的产生前提是多个线程并发访问共享数据,那么一种保障线程安全的方法就是将多个线程对共享数据的并发访问转换为串行访问,即一个共享数据一次只能被一个线程访问,该线程访问结束后其他线程才能对其进行访问。锁就是利用这种思路来实现线程同步机制。

GoLang中换了个思路,通过通道(channel)来实现共享数据的安全性。

3.锁的相关概念

锁在编程里是个蛮有趣的概念。特定代码的作用域或是lock() 和unlock()方法之间的代码构成的区域就是“器物”的表征,线程访问其中的共享数据相当于解开“扣件”,打开了“器物”;通常所说“获得xx锁”,更像是获得了“钥匙或暗码”能够打开“扣件”的凭证。

锁相关的一些概念。

  1. 临界区(Critical Section):获得锁之后和释放锁之前的这段时间内执行的代码
  2. 内部锁(Intrinsic Lock)与显式锁(Explicit Lock):按时Java虚拟机对锁实现的方式划分,内部锁(由关键字synchronized实现)与显式锁(Lock接口的实现类实现)
  3. 可重入性(Reentrancy):一个线程在其持有一个锁的时候能否再次(或多次)申请该锁
  4. 锁的争用与调度:锁也可以被看作是一种排他性的资源,因此争用、调度概念也对锁适用。锁的调用基本上是Java虚拟机的设计者需要考虑的问题。Java平台中锁的调度策略包括了公平与非公平两种,内部锁属于非公平锁而显式锁则既支持公平锁又支持非公平锁
  5. 锁的粒度:一个锁实例所保护的共享数据的数量大小就被称为锁的粒度。但这是一个相对概念,应该根据实际情况来说明锁粒度的大小
  6. 如果有多个线程访问同一个锁所保护的共享数据,那么就你这些线程同步在这个锁上,或是对这些线程所访问的共享数据访问进行了加锁;相应地,这些线程所执行的临界区就被为这个锁所引导的临界区。
  7. 锁的排他、互斥:都是指一个锁一次只能被一个线程所持有的特性。

以上就是与锁相关的一些概念,这些概念也比较通用,在其他编程语言里或多或少也会有它们的身影。

4.内部锁:synchronized关键字

Java平台中任何一个对象都有唯一一个与之关联的锁。这种锁被称为监视器或是内部锁。内部锁是一种排他锁,它能保障原子性、可见性和有序性。

内部锁通过synchronized关键字实现的。synchronized关键字可以修饰方法及代码块。修饰方法时,此方法被称为同步(静态/实例)方法;修饰代码块时,被称为同步(静态)代码块。

同步方法

synchronized修饰的方法被称为同步方法。同步方法的整个方法体就是一个临界区。

public synchronized void hepl(){}

同步静态方法相当于以当前类对象为引导锁的同步块。

同步块

synchronized(锁句柄){}

synchronized关键字所引导的代码块就是临界区。锁句柄是一个对象的引用。锁句柄可以填写this关键字,表示当前对象。习惯上也直接称锁句柄为锁。锁句柄对应的监视器就被称为相应同步块的引导锁。相应地,我们称呼相应的同步为该锁引导的同步块。 作为锁句柄的变量通常采用final修饰。这是因为锁句柄变量的值一旦改变,会导致执行同一个同步块的多个线程实际上使用不同的锁,从而导致竞态。因而,锁句柄的变量通常声明形式为private final Object lock = new Object();

特性

线程在执行临界区代码时必须持有该临界区的引导锁。一个线程执行到同步块(同步方法也可看作是同步块)时必须先申请该同步块的引导锁,只有申请成功该的线程才能够执行相应的临界区。一个线程执行完成临界区代码后引导该临界区的锁就会被自动释放。在这个过程中,线程对内部锁申请与释放的动作由Java虚拟机负责完成,这也是synchronized实现的锁被称之为内部锁的原因。 内部锁的使用并不会导致锁泄漏。Java编译器对同步块代码作了特殊的处理,这使得临界区的代码即使抛出异常也不会妨碍内部锁的释放。

内部锁的调度

Java虚拟机会为每个内部锁分配一个入口集,用于记录等待获得相应内部锁的线程。多个线程申请同一个锁的时候,只有一个申请都能够成为该锁的持有线程(即申请锁成功),而其他申请者的申请操作会失败。这些申请失败的线程并不会抛出异常,而是会被暂停(生命周期状态变为BLOCKED)并被存入相应锁的入口集中等待再申请锁的机会。入口 集中的线程就被称为相应内部锁的等待线程。当该内部锁被释放时,入口集中的任意线程会被Java虚拟机唤醒,得到再次申请锁的机会。由于是非公平的高度,被唤醒的等待处理器运行时可能还有其他新和活跃线程(RUNNABLE状态且未进入过入口集)与该线程抢占这个被释放的锁,因此被唤醒的线程不一定就能成为该锁的持有线程。另外,Java虚拟机从入口集中选择一个等待线程的算法与虚拟机具体实现有关,总的来说是随机的。(像极了女神和她的备胎们)

5.显式锁:Lock接口

显式锁是自JDK1.5引入的排他锁,其作用与内部锁大致相同,并额外提供些特性。

显式锁是java.util.concurrent.locks.Lock接口的实例。该接口对显式锁进行了抽象,类java.uitl.concurrent.locks.ReentrantLock是它默认实现类。

private final Lock lock = ....; // 一个Lock接口的实例

...lock.lock(); // 申请锁

try{// do something}finally{lock.unlock(); // 手动释放锁,避免锁泄漏}​

6.改进型锁:读写锁

锁的排他性使得多个线程无法以线程安全的方式在同一时刻对变量进行读取(只读不更新),不利于提高系统的并发性。 读写锁(Read/Write Lock)是一种改进型的排他锁,也被称为共享/排他锁(Shared/Exclusive Lock)。读写锁允许多个线程可以同时读取(只读)共享变量,但是一次只允许一个线程对共享变量进行更新(包括读取后再更新)。任何线程读取变量的时候,其他线程无法更新这些变量 ;一个线程更新共享变量的时候,其他任何线程都无法访问该变量。

7.原子变量类

原子变量类比锁的粒度更细,更轻量级,并且对于在多处理器系统上实现高性能的并发代码来说是非常关键的。原子变量将发生竞争的范围缩小到单个变量上。 原子变量类相当于一种泛化的 volatile 变量,能够支持原子的、有条件的读/改/写操作。 原子类在内部使用 CAS 指令(基于硬件的支持)来实现同步。这些指令通常比锁更快。 原子变量类可分为4组:

| 分组 | 类 |

| 基础数据型 | AtomicBoolean AtomicInteger AtomicLong |

| 数组型 | AtomicIntegerArray AtomicLongArray AtomicReferenceArray |

| 字段更新器 | AtomicIntegerFieldUpdater AtomicLongFieldUpdater AtomicStampedReference |

| 引用型 | AtomicReference AtomicReferenceFieldUpdater AtomicMarkableReference |

8.轻量级同步机制:volatile关键字

volatile有“易挥发”的意思,引申为“不稳定”。volatile关键字用于修饰共享可变变量,即没有使用final关键字修饰的实例变量或静态变量,相应的变量被称为volatile变量。

volatile关键字表示被修饰的变量的值容易变化(即被其他线程更改),因而不稳定。volatile变量的不稳定性意味着对这种变量的读写操作都必须从高速缓存或者主内存中读取,以获取变量的相对新值。因些,volatile变量不会被编译器分配到寄存器进行存储,对volatile变量的读写操作都是内存访问操作。

volatile关键字常被称为轻量级锁,其作用与锁的作用有相同的地方:保证可见性的有序性。在原子性方面,它仅能保障写volatile变量操作的原子性,但没有锁的排他性;其次,volatile关键字的使用不会引起上下文切换(正是“轻量级”的原因)。

多线程基本概念 基本概念 进程 (Process):一个程序运行起来时在内存中开辟一段空间用来运行程序,这段空间包括 heap、stack、data segment 和 code segment。例如,开一个 QQ 就表明开了一个 QQ 进程。 线程 (Thread):每一个进程中都至少有一个线程。线程是指程序中代码运行时的运行路径,一个线程表示一条路径。例如 QQ 进程中,发送消息、接收消息、接收文件、... 阅读详情

相关推荐

Cadence OrCAD常见引脚错误排查指南:从原理图到封装的完整解决方案

本文详细解析Cadence OrCAD设计中常见的引脚错误问题,提供从原理图到封装的系统化解决方案。涵盖错误诊断、元件库修复、封装管理及自动化处理技巧,帮助工程师高效解决ORCAP-36022等典型错误,确保设计流程顺畅。

weixin_29294975的博客 255

【多线程】(一)多线程概念

线程可以看做是进程中的一个执行单元,也就是说一个线程就是一个执行流。一个进程可以包含多个线程,每个线程都有自己的执行路径和执行状态,并且共享进程的地址空间以及资源。它们可以直接访问进程的数据,包括全局变量和共享内存区域。因此线程之间的通信和数据共享相对于进程来说更加的容易和高效。另外,与创建进程相比,线程的创建和切换开销更小。

qq_61635026的博客 465

西门子1500T系列凸轮同步(CAMIN指令用法)

添加凸轮工艺对象(TO_CAM),也就是凸轮表。开始编程,先写2个轴的使能、回原点与主轴的定位。监控主轴与从轴的位置、速度关系是否满足实验要求。1.添加工艺对象(1个定位轴,1个同步轴)调用CAMIN指令 ,凸轮耦合。主轴为旋转轴且为模数轴。3.调用插补凸轮盘指令。4.仿真、监控、调试。

gyxgyx789的博客 1万+

什么是多线程

什么是多线程? 多线程是一种同时执行多个线程的技术,它不允许进程或操作系统生成计算机中运行的程序的多个副本,而是在不创建程序多个副本的情况下,同时管理多个用户或同一用户的多个请求。 线程是轻量级进程,是处理的最小单元,同时运行多个线程称为多线程。因此,基本上,这是一种由多个处理器使用单个代码集的方法。 了解多线程 1.为了理解多线程,需要理解两个术语。 (1)线程:线程是进程的独立或基本单元。 (2)进程:正在执行的程序称为进程,一个进程中存在多个线程。 2.多线程中的执行是并发的和并行的。 (1)并发执行

qf2019的博客 1万+

Zigbee通信(CC2530终端 + ESP32-C6协调器)

实现了CC2530 zigbee终端与ESP32-C6 zigbee协调器的通信交互。

Ecsply的博客 2564

电流采样电路设计:差分放大与ADC采集详解

在电机控制、电源管理、电池监测等应用中,电流采样是一个关键环节。通常,我们使用小阻值的采样电阻将电流信号转换为电压信号,再通过运放放大后送入ADC进行采集。本文将详细分析一种基于差分放大器的电流采样电路,包括信号放大、参考电压偏置、滤波保护以及ADC转换计算等内容。

W0s477的博客 2万+

多线程简介

一、概念 1、并发与并行 并行:多个任务在同一个时刻点同时执行。效率高 并发:多个任务在同一段时间内分时执行。效率低,宏观上同时执行,微观上分时执行。 2、进程与线程 进程:内存中正在运行的应用程序,是系统进行资源分配和调度的基本单位。每一个进程有自己独立的运行空间,相互之间不影响。进程就是程序的一次执行过程,即是一个进程从加载到内存到从内存中释放消亡的过程。 线程:进程内部的独立运行单元,是操作系统能够进行运算调度的最小单位,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序.

Bug_marker的博客 4914

手把手教你用ESP32-C3打造智能聊天机器人-立创实战派

本文将详细介绍如何利用立创ESP32-C3开发板,烧录小智AI程序,快速实现一个功能强大的聊天机器人。

举世誉之而不加劝,举世非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。 5534

多线程概念以及线程同步

并发与并行概念,多线程概念.通过synchronized关键字或者Lock锁解决线程安全问题.线程通讯.

weixin_69812259的博客 1063

【AI智能体】基于OpenCode 搭建Skills环境与项目实战开发详解

基于OpenCode 搭建Skills环境与项目实战开发详解

congge 8899

74.9008深度刷机原理|高通QPST/Firehose底层刷写协议详解

移动设备刷机与底层维修技术指南 本文为移动设备维修人员和高级玩家提供全面的刷机与底层维修技术指南,涵盖高通、联发科和苹果A系列芯片的主要操作。 主要内容 核心操作:Bootloader解锁、Fastboot刷写、EDL深度修复、iTunes DFU模式恢复和分区表重建 适用场景:系统故障修复、底层损坏恢复、安全限制解除、系统降级和深度硬件维修 关键技术:详细解析刷机协议栈层级、关键分区作用和刷机安全机制 操作步骤: 环境搭建与驱动安装 Bootloader解锁(以小米为例) 高通机型系统刷写 苹果设备DFU

2601_95651806的博客 205

一.多线程的概念

线程,进程,多线程 说起进程,不得不说一下程序(就是我们所写的代码),程序是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念。 进程则是执行程序的一次执行过程。及在一个操作系统中,每一个独立执行的程序都可以称之为一个进程,也就是“正在运行的程序”。它是一个动态概念。是系统资源分配的单位。例如:QQ,播放器,游戏等。 线程就是指的是进程中的实际运行单位,它是操作系统中进行运算调度的最小单位。换句话说,线程是进程中的一个最小运行单位。每个运行的程序都是一个进程,在一个进程中还可以有多个执行

大武不想当菜鸟的博客 5567

[Dify实战] 解决 Dify 导入 DSL 文件时报 “DSL 版本差异” 的兼容性问题

摘要:本文针对Dify开发者在导入.dsl文件时遇到的版本警告提示问题,分析其根源在于DSL文件与当前系统版本不一致。解决方案是通过导出当前Dify应用的DSL文件查看版本号,手动修改待导入文件的version字段以匹配。文章详细说明了操作步骤,并给出使用专业编辑器、避免修改其他字段等实用建议,帮助开发者规避版本不兼容问题,提升多模态AI应用开发效率。

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 961

多线程基础概念

多线程; 线程概念:线程是什么? 1.pcb是进程。但是linux下线程通过pcb实现。pcb是一个轻量级进程。 同一个进程组中的pcb公用同一个虚拟地址空间,共享进程中大部分资源; / 独有;栈,寄存器,信号屏蔽字,errno,线程id 共享;虚拟地址空间。(数据段/代码段),文件描述符表,信号处理方式,当前工作路径,用户id/组id, 进程是资源分配的基本单位 线程是cpu调度的基本单位 多线...

Blue_Tong的博客 285

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

java多线程概念

4.同步(Synchronization): 当多个线程访问共享资源时,需要同步机制来保证数据的一致性和完整性,synchronized关键字可以用来修饰方法或代码块,确保同一时刻只有一个线程可以执行该段代码。3.线程池(Thread Pool): 为了解决频繁创建和销毁线程带来的性能开销,可以使用线程池管理线程,复用已有线程而不是每次都创建新线程。理解这些概念对于编写健壮的多线程程序非常重要。8.守护线程(Daemon Thread): 守护线程是一种为其他线程提供服务的线程,比如垃圾回收。

weixin_57763462的博客 517

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

【Linux】————多线程(概念及控制)

1.一个冷知识:屏蔽力是一个人最顶级的能力,任何消耗你的人和事,多看一眼都是你的不对。2.你不用变得很外向,内向挺好的,但需要你发言的时候,一定要勇敢。正所谓:君子可内敛不可懦弱,面不公可起而论之。3.成年人的世界,只筛选,不教育。4.自律不是6点起床,7点准时学习,而是不管别人怎么说怎么看,你也会坚持去做,绝不打乱自己的节奏,是一种自我的恒心。5.你开始炫耀自己,往往都是灾难的开始,就像老子在《道德经》里写到:光而不耀,静水流深。

bhbcdxb123的博客 2990

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

多线程概念,线程控制

多线程 线程概念:进行多任务处理 多任务处理: 多创建几个进程,一个进程就有一个pcb,能够串行化的完成一个任务,在一个进程创建多个pcb,因为pcb是调度程序运行的描述,因此有多少个pcb就会有多少个执行流程 多进程 多线程 最早的时候,进程就是一个pcb,操作系统通过pcb实现调度管理;然而学习多线程,因为线程是进程中的一个执行流,并且这些pcb共用同一个虚拟地址,这些pcb更加轻量化,因此也被称为轻量级进程 在linux中,pcb就是调度程序运行的描述,一个pcb就可以调度一段程序的运行; 创.

qq_43362331的博客 214

多线程相关概念

目录相关概念停止线程的方式多线程的5种状态join方法 相关概念 进程:启动一个应用程序,就会开启一个进程(微信,QQ,浏览器等等) 线程:程序的执行路径 进程和线程的区别:进程是在操作系统下的并发,线程是在应用程序下的并发 多线程:在同一进程中开启了多个不同的执行路径,多个路径同时执行 多线程好处:提高程序整体运行速度,快速响应 多线程的应用场景: 异步发送短...

Noneplus 193

一、多线程的基本概念

多线程的基本概念

shiyu_951的博客 382

java中多线程的概念_Java多线程概念及状态详解

Java多线程编程概念Java语言的优势之一就是线程处理较为简单,一般操作系统都支持同时运行多个任务,一个任务通常就是一个程序,每个运行中的程序被称为一个进程,当一个程序运行时,内部可能包含多个孙旭执行流,每个顺序执行流就是一个线程.进程:同一个操作系统中的一个子程序,包含了三个部分----虚拟CPU,代码,数据多进程:同一个操作系统中执行的多个并行的子程序,可以提高CPU的使用率线程:在同一个进...

weixin_39847556的博客 144

【Linux多线程】线程的概念

本篇博客将会介绍线程的基本概念,理解线程与进程的区别和联系,以及进程地址空间第四讲

m0_74215144的博客 1239

Java中多线程的使用(一):多线程基本概念

线程的概念 线程(英语:thread)是操作系统能够进行运算调度的最小单位。(百度百科) 可以理解为一个项目中的一个小的任务,在调度层面上,任务不能再分。 多线程的概念 多线程(英语:multithreading),是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。具有这种能力的系统包括对称多处理机、多...

jack5s的博客 204

【多线程】线程的基本概念

一、前言: 提及多线程不得不提及“进程”这个概念。“百度百科”里对“进程”的解析如下:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。 初看这个文字会觉得十分的抽象,难以理解。但看到下面的图片,大家可能会对“进程”有一个感性的认知。一个PID对应一个进程。...

柠檬树 9892

C++11多线程概念

一个:进程自动包含一个主线程,主线程随着进程默默地启动运行,我们可以通过编码来创建多个其他子线程,创建的数量最大也不建议超过200-300个。单核系统的并发不是真正的并发,每一时刻只能执行一个任务,由操作系统调度,需要多次任务切换。线程不是越多越好,每个线程都需要一个独立的堆栈空间(1M),线程之间的切换要保存很多中间状态,方便恢复。(1.3)线程:每个进程,都会有一个唯一的主线程,当ctrl+f5运行的时候,实际上进程的主线程来调用了这个main函数中的代码。同一个电脑:管道,文件,消息队列,共享内存;

qq_53164174的博客 277

java多线程概念和原理

多线程是程序员面试时常常会面对的问题,对多线程概念的掌握和理解水平,也会被一些老鸟用来衡量一个人的编程实力的重要参考指标。不论是实际工作需要还是为了应付面试,掌握多线程都是程序员职业生涯中一个必须经过的环节。其实当你把“多线程”和你的“职业生涯”联系在一起考虑的时候,就会觉得“多线程”是多么的渺小,对,没有跨越不过的山。不过就算它很渺小,但也有可能改变你的人生轨迹。不用担心,如果你对多线程还不太熟

jzhf2012的专栏 1847
上一篇: 数据库写法
下一篇: Servlet
MemoryHer
博客等级 码龄5年 4粉丝 48原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值