《多线程》

Ruby 多线程 多线程是一种允许单个程序同时执行多个任务的技术。在传统的单线程程序中,任务通常是顺序执行的,这意味着如果一个任务需要较长时间才能完成,它会阻塞后续任务的执行。而在多线程环境中,程序可以同时运行多个线程,每个线程执行一个独立的任务,从而提高了程序的效率和响应速度。 阅读详情

1.聊一聊多线程

一块共享空间或一个共享变量被多条线程操作。

多线程的程序要想让其正确运行,关键在于保证线程执行过程中的 可见性,原子性

常用的volatile就是保证线程间“可见性”的 同步关键字。

volatile如何保证可见性?他会让当前工作线程立即将缓存写到主存。其他处理器通过嗅探总线上传播过来的数据检测自己的缓存值是不是过期。如果过期其他处理器会重新从内存中把数据读取到缓存中处理。

但由于每一个线程执行都不是原子的,导致多个线程并发执行下,volatile会出现“写覆盖”的现象。

这时就要使用基于CAS原理的各种方法来保证原子操作了。例如JUC包中Atomic接口下的Integer实现类等等。

CAS意为“比较并交换”,工作内存每次把值写回到主存前,都会先判断:主存中的当前值是否为 工作内存执行操作前 从主存中拿的那个值。 只有当2个主存值相等,工作内存的值才会写回到主存。

CAS 为什么是原子性的操作呢?拿CAS原理的实现类举例:AtomicInteger类中调用了unsafe方法,这个unsafe方法存在于Rt.jar这个包下。 这里的unsafe方法实际上是调用的操作系统方法,操作系统直接操作内存偏移值来进行“写”操作,这一过程是原子性的。

那操作内存偏移值实际上做了什么呢?

最后到汇编语言这一层执行的是lock cmpxchgl操作。这条汇编指令执行时锁住了“北桥信号”,“北桥信号”负责与cpu联系并锁定内存,此时其他处理器没法访问同一片内存区域。

CAS缺陷:由于CAS操作只比较值,而不比较过程,因此存在ABA问题。即虽然开始和最后结果值相同,但中间过程经历的变动不影响CAS操作。解决方案就是 采用+“时间戳”验证每次修改的版本这种方法

2.哪些集合类是并发不安全的?哪些是并发安全的?

ArrayList,SetList,HashMap是并发不安全的。

copyOnWriteArrayList,copyOnWriteArraySet,ConcurrentHashMap 采用了volatile和cas操作是并发安全的

3.线程池

Java的线程池_我能在河边钓一整天的鱼-优快云博客

4.threadlocal

ThreadLocal_我能在河边钓一整天的鱼-优快云博客

3.sychronized锁升级

无锁——无线程访问不加锁

偏向锁——如果只有一个线程访问一段同步代码,在这个线程获取锁的同事不会释放锁。即没有CAS操作。当又来了一个线程时,偏向锁会升级为轻量级锁

轻量级锁——当一个线程持有锁时,另一个线程回进入自旋状态。

自旋减少了线程频繁切换导致的性能损耗,但是增加了cpu占用时长。

当一个线程自旋超过一定次数或者又来了一个线程,轻量级锁会膨胀为重量级锁

重量级锁——重量级锁会使除了拥有锁的线程外,其他线程全部阻塞,无自旋

4.谈谈你对AQS的理解

AQS是一个基于FIFO的双向队列。通过CAS操作进行原子修改state的int值,维护线程同步状态。

ReentrantLock,CountDownLatch等都基于AQS来实现。AQS包含state变量,加锁线程,等待队列等

拿ReentrantLock举例。当一个线程1过来的时候,调用ReentrantLock的lock()方法,这个加锁的过程就是直接利用CAS操作将state变成1,并将当前线程设置为自己

在这里插入图片描述

 线程2过来以后,发现state1,这个时候用CAS改变state为1的操作就会失败,然后线程2会判断一下当前线程是不是自己,不是自己则加锁失败,线程2进入等待队列。当线程1释放锁后,线程2就可以竞争锁了(非公平锁的情况),当然如果是公平锁的情况,当线程1释放锁后线程2自然就会得到锁
在这里插入图片描述

简单说一下线程1释放锁的过程,释放锁的过程就是将state变量减1,当减为0时彻底释放,并将加锁线程变量设置为null。(值得注意的是,可重入锁的情况下state的值并不一定是1,有可能是 2 3 4,这种情况下state直到减为0的时候才会释放锁)。 

在这里插入图片描述

线程1彻底释放锁后,线程2重新尝试加锁,这时进行CAS操作将state由0变成1,并设置加锁线程变量。同时加锁成功后会出队列。 

微调BERT进行中文文本分类任务(Pytorch代码实现) BERT(Bidirectional Encoder Representation from Transformers)是2018年10月由Google AI研究院提出的一种预训练模型。其模型结构由多层Transformer的Encoder堆叠而成,在大规模语料中进行预训练后,迁移到下游任务,仅进行参数微调训练,就能显著提升性能。本文聚焦于微调中文BERT进行新闻标题分类任务的代码实现。 阅读详情

相关推荐

别再被SpringerLink虐了!手把手教你搞定LaTeX源文件提交(附正确文件顺序和类型选择)

本文详细解析了SpringerLink投稿系统中LaTeX源文件提交的常见问题与解决方案,包括文件打包、类型选择和顺序排列等关键步骤。通过实战经验,帮助科研人员避开隐形陷阱,一次性完成LaTeX提交,提升投稿效率。特别针对`.bst`和`.cls`文件的正确处理提供了专业指导。

weixin_42522964的博客 441

线程安全之CAS机制详解(分析详细,通俗易懂)

背景介绍:假设现在有一个线程共享的变量c=0,让两个线程分别对c进行c++操作100次,那么我们最后得到的结果是200吗? 1.在线程不安全的方式下:结果可能小于200,比如当前线程A取得c的值为3,然后线程A阻塞了,线程B取得的c的值也是3,然后线程B也阻塞了,现在线程A被唤醒执行了++操作使得c=4,结果写回c值内存,线程A执行结束,线程B被唤醒执行了++操作使得3++=4,也写回了c值内存,现在问题来了,两个线程分别进行了一次++操作,最后c值却为4而不是5,所以c值最后的结果肯定是小于200的,产

mijichui2153的博客 1892

QT实现HTTP文件(夹)下载的完整流程与实战技巧

本文详细介绍了使用QT框架实现HTTP文件和文件夹下载的完整流程与实战技巧。通过QNetworkAccessManager等核心类,讲解了从单文件下载、大文件处理、进度显示、暂停/取消功能,到复杂的文件夹下载策略。文章重点剖析了断点续传、错误处理与网络健壮性等关键问题,为C++桌面应用集成稳定高效的下载功能提供了专业指导。

weixin_29239279的博客 276

CAS无锁同步:高并发利器解析

CAS(Compare-And-Swap)是一种原子操作,用于在多线程环境中实现无锁同步。它的核心思想是“比较并交换”:检查某个内存位置的值是否与预期值匹配,如果匹配,则更新为新值。这一操作是原子的,能够避免传统锁机制的开销和潜在的死锁问题。CAS 常用于实现无锁数据结构(如无锁队列、无锁栈)和并发算法(如计数器、自旋锁)。CAS 的原子性确保在多线程环境中,只有一个线程能够成功修改共享变量,其他线程需要重试或采取其他策略。现代编程语言(如 Java、C++)通过内置函数或类库提供了 CAS 的抽象接口。

KCw_6h6i的博客 257

新华硕笔记本ubuntu18.04双系统安装之后,wifi没有显示无法链接wifi

本来我以为跟简单安装一个wifi网卡的驱动就可以解决的问题,没想到花了我一早上的时候解决… 惭愧。 另外,本来是没打算写这篇博客的,但是我在搜索解决这个问题的过程中, 发现多人提出的解决方案跟我的都不一样,甚至我的解决方案都没有搜到相应的答案,还是只能靠自己啊。。 言归正传,还是说说怎么正确的安装wifi驱动吧! 1. wifi没有正确安装、或没有正确配置的表现 我的电脑现象: 有wifi图标, wifi设置上显示unaviable,无法搜索到任何wifi; 还有其他类似的表现,大家可以看看其他朋友的提

Ian的博客 1889

【大模型】DeepSeek 高级提示词技巧使用详解

DeepSeek 高级提示词技巧使用详解

congge 1万+

synchronized、volatile与CAS:Java线程同步机制概览

在Java多线程编程中,synchronized、volatile和CAS(Compare-And-Swap)是三种常用的同步机制,它们各自在解决线程安全问题时扮演着不同的角色。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 6294

EtherCAT主站IGH-- 49 -- 搭建xenomai系统及自己的IGH主站

以上就是搭建xenomai系统及自己的IGH主站的内容。有不明白的地方欢迎留言;有建议欢迎留言,我后面编写文档好改进。创作不容,如果文档对您有帮助,记得给个赞。

常驻客栈的博客--嵌入式EtherCAT 3154

多线程—CAS

这就好⽐, 判定这个⼿机是否是翻新机, 那么就需要收集每个⼿机的数据, 第⼀次挂在电商⽹站上的⼿机记为版本1, 以后每次这个⼿机出现在电商⽹站上, 就把版本号进⾏递增. 这样如果买家不在意这是翻新机, 就买. 如果买家在意, 就可以直接略过.轮到线程2 执⾏了, 发现当前存款为 100, 和之前读到的 100 相同, 但是当前版本号为 3, 之前读到的版本号为 1, 版本⼩于当前版本, 认为操作失败.存款 100. 线程1 获取到 存款值为 100, 版本号为 1, 期望更新为 50;

2301_80418043的博客 1045

短距激光雷达专业讲解:定义、架构、技术路线与选型逻辑

短距激光雷达,通常指有效探测距离不大于 50 米的激光雷达产品。它主要服务于服务机器人、扫地机器人、AGV/AMR、无人机、智能手机、AR/VR、工业安全等中近距感知场景。它与车载中长距激光雷达的最大区别,不是“探测距离短一点”,而是整套工程目标不同。短距激光雷达的核心诉求是:小体积、低成本、高帧率、强抗光、嵌入式集成。单价从百元级扫地机模组,到数千元级工业 3D 雷达不等。一句话概括:中长距车载激光雷达追求远距离、高可靠、车规寿命;

致力于lidar应用开发 151

任务混部最少服务器数量计算问题

这里的并行度指的是该任务运行时会占用的服务器数量。要注意的是,一个服务器在每个时刻可以被任意任务使用,但同一时刻最多只能被一个任务占用,并且任务运行结束后会立即释放服务器(结束时刻不占用)。最后,我们从字典中找出服务器数量的最大值,这个最大值就是完成这批任务混部最少需要的服务器数量。对于每个任务,我们会遍历其对应的时间区间,将该任务的并行度累加到对应时刻的服务器数量上。任务混部的目标是让这批任务由同一批服务器承载运行,你需要计算完成这批任务混部最少需要多少服务器,以此来最大化控制资源成本。

m0_62153576的博客 104

多线程(四)--非阻塞同步,CAS 原理分析

一、序言        前面我们提到的synchronized  等锁机制是一种阻塞同步,虽然它完成了我们的原子性操作,和线程安全,但是这种阻塞同步机制是比较耗费性能的,因为在阻塞和唤醒等状态转换中,是需要CPU指令进行帮忙实现,这要的调度是比较耗时的,因此这种策略是一种悲观策略,当然我们需要线程安全,又要高效,在一定情况下我们会采用非阻塞同步机制。            二、非阻塞同...

Hello World 468

基于Xilinx XDMA 的PCIE通信

基于Xilinx XDMA 的PCIE通信 概述:   想实现基于FPGA的PCIe通信,查阅互联网各种转载…基本都是对PCIe的描述,所以想写一下基于XDMA的PCIe通信的实现(PCIe结构仅做简单的描述(笔记),了解详细结构移至互联网)。实践实践!!! 说明: 参考文档: PCI Express Base Specification Revision 3.0 PCI Express Base Specification Revision 5.0 pg195-pcie-dma PCI Express体系

Crazzy_M的博客 1万+

Arduino的多线程

前言 本章节是如何使用Arduino 的多线程技术。截止目前,Arduino 的性能很棒,但是如果我们想在不同的时间间隔中,完成两件、多件的任务呢? 此时,我们就需要使用一种类多线程技术来处理项目。 Arduino 的多线程 \ 类多线程? 为了正确理解多线程技术和Arduino 之间的关系,我们需要理解为什么它不是真正的多线程。 在计算机CPU上,多线程应用程序...

TEST_PROGRAM_NONE 3万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

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

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

多线程一,什么是多线程,创建多线程的几种方式

1 多线程相关概念 并发(Concurrent):在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行。 同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果,但在微观上并不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行。 并行(Parallel):当系统有一个以上CPU时,当一个CPU执行一个进程时,另一个CPU可以执行另一个进程,两个进程互不抢占CPU资源,可以同时进行,这种方式我们称之为

世上哪有什么岁月静好,不过是有人替你负重前行 2万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Qt多线程

Qt 提供了多种方式来处理多线程编程,它不仅使多线程操作更易于管理,还与 Qt 的事件驱动架构紧密集成。下面是 Qt 多线程编程的详细介绍,包括关键类、模式以及常见的使用场景。

強雲的博客 2299

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

一文讲清多线程和多线程同步

一个进程内多个线程并发执行的情况就叫多线程,每个线程是一个独立的执行流,多线程是一种编程模型,它与处理器无关、跟设计有关。并行计算:充分利用多核,提升整体吞吐,加快执行速度。后台任务处理:将后台线程和主线程分离,在特定场景它是不可或缺的,如:响应式用户界面、实时系统等。我们用2个例子作说明。同一进程内的多个线程会共享数据,对共享数据的并发访问会出现(竞争状况)。协调多个线程对共享数据的访问,避免出现数据不一致的情况。

excellent_fish_c的博客 1843

C++多线程-多线程调试

软件调试是我们软件开发过程中的重要一课。在前面,我们也讨论过程序调试,比如说这里。今天,我们还可以就软件调试多讲一些内容。比如说条件断点,数据断点,多线程断点等等。 #include <stdio.h> int value = 0; void test() { int total; int index; total = 0; ...

逍遥云恋 2315

php 怎么实现多线程,php 实现多线程

通过php的Socket方式实现php程序的多线程。php本身是不支持多线程的,那么如何在php中实现多线程呢?可以想一下,WEB服务器本身都是支持多线程的。每一个访问者,当访问WEB页面的时候,都将调用新的线程,通过这一点我们可以利用WEB服务器自身的线程来解决PHP不支持多线程的问题。下面给出通过 fsockopen() 建立socket连接,然后用 用fputs() 发送消息,来实现的PHP...

weixin_28756427的博客 1万+

什么是多线程

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

qf2019的博客 1万+

多线程爬虫

多线程简单描述就是指在一个进程中运行多个线程,以此来加快程序的运行效率。我们在写python代码时,那种按部就班,一步一步写完并执行的就是单线程;而在python中,想要实现多线程需要用到类Thread。

qq_75229677的博客 1774

单核多线程与多核多线程

单核多线程与多核多线程 或许有些同学对于单核多线程和多核多线程有点误区,因为会听到一些同学问为什么单核能处理多线程,总结了一些干货,下面会通俗说明下。 线程和进程是什么 线程是CPU调度和分配的基本单位(可以理解为CPU只能看到线程) 进程是操作系统进行资源分配(包括cpu、内存、磁盘IO等)的最小单位 单核多线程 单核多线程指的是单核CPU轮流执行多个线程,通过给每个线程分配CPU时间片来实...

qq_27185561的博客 1万+

多线程的理解

多线程的理解 什么是多线程? ​ 多线程的简单理解,即:同时处理多个事项,宏观方面可以理解为计算机在cpu的调度下,同时进行多项工作;类比可以看做,武侠高手左手画圆,右手画三角形,同时进行;但是,实际上微观理解,单核cpu同一时间只能处理一件事情,所以是将各个线程分为细小的时间片来交替进行,但是由于相对于人类感官速度极快,产生统一时间俩件事情同时进行了。打个比方,现在用一台单核cpu计算机,同时打开俩个视频,只看视频播放画面,其实是将视频切割为一个个细小的时间片交替cpu调度执行,同一时间点,只有一个在被c

qq_36098674的博客 3137

多线程的类型

1 交错/临时多线程 (1)粗粒度多线程: 在一个线程运行到被一个通常会造成长延迟停顿的事件阻塞时,就会发生最简单类型的多线程。这种停滞可能必须访问片外存储器来弥补高速缓存的缺失,数据返回可能需要数百个CPU周期。线程处理器会在不等待停顿解决的情况下执行切换到另一个准备运行的线程。只有当前一个线程的数据到达时,前一个线程才会被放回到准备运行的线程列表中。 例如: 周期i:线程A发出指令j。 周期i + 1:线程A发出指令j + 1。 周期i + 2:线程A发出指令j + 2,这是一个在所有高速缓存中未被执行

iPwisdom的博客 1947

Python多线程

想象你在厨房做饭:一边煮着汤,一边切着菜,偶尔还要看看烤箱里的蛋糕。这种同时处理多个任务的能力,就是多线程的生动体现。在计算机中,线程是程序执行的最小单位。多线程允许一个程序同时运行多个任务,特别适合I/O密集型操作(如网络请求、文件读写等)。适用场景I/O密集型任务(网络请求、文件操作等)需要保持响应性的GUI应用注意事项避免过度使用线程(线程也有开销)注意线程安全问题(使用锁、队列等)考虑使用线程池而非频繁创建线程替代方案CPU密集型任务:考虑multiprocessing。

陆小森_红齐飘飘的博客 2260

【多线程】多线程基础操作

想让线程结束,只需在 catch 中加上 break。当引入的线程到达一定数量后在尝试继续引入新的线程无法提升,当线程数量太多的时候,线程之间就会相互竞争CPU的资源(CPU核心数有限)非但不会提高效率,反而增加调度开销。操作系统进行"多任务调度"本质上是在调度PCB(线程在系统中的调度规则就和之前的进程是一样的,线程的PCB中也有状态,优先级,上下文,记账信息…5.每个线程,也是一个独立的执行流,可以执行一些代码,并且单独的参与到CPU调度中(状态,上下文,优先级,记账信息,每个线程都有自己的一份)

m0_50534425的博客 1483
上一篇: Java比较两个对象并获取其中不相等的字段
下一篇: 《springboot》
我能在河边钓一整天的鱼
博客等级 码龄10年 346粉丝 812原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值