为什么要使用多线程(并发编程)

目录

1.上下文的切换

1.1 什么是上下文切换

2. 并发编程的死锁问题

2.1 死锁产生的原因

2.2 避免死锁的方法

3.资源限制的挑战3.1 什么是资源限制


    

并发编程的目的是为了让程序更快,大家都知道并不是开启的线程越多越快,因为开启的线程越多随即面临的挑战也越多,比如:上下文的切换、死锁问题、以及硬件和软件资源的限制问题。

1.上下文的切换

1.1 什么是上下文切换

        学习操作系统的时候,都了解到:单核处理器也支持多线程执行代码,CPU通过给每个线程分配CPU时间片来实现这个机制。时间片是CPU分配给各个线程的时间,因为时间片非常短,所以CPU通过不停地切换线程执行,让我们感觉多个线程是同时执行的,时间片一般是几十毫秒(ms)。

         CPU通过时间片分配算法来循环执行任务,当前任务执行一个时间片后会切换到下一个任务。但是,在切换前会保存上一个任务的状态,以便下次切换回这个任务时,可以再加载这个任务的状态。所以任务从保存到再加载的过程就是一次上下文切换。

1.2   如何减少上下文切换

    减少上下文切换的方法有无锁并发编程、CAS算法、使用最少线程和使用协程。

1. 无锁并发编程。多线程竞争锁时,会引起上下文切换,所以多线程处理数据时,可以用一些办法来避免使用锁,如将数据的ID按照Hash算法取模分段,不同的线程处理不同段的数据。


2.CAS算法。Java的 Atomic包使用CAS算法来更新数据,而不需要加锁。

3.使用最少线程。避免创建不需要的线程,比如任务很少,但是创建了很多线程来处理,这样会造成大量线程都处于等待状态。

4.协程:在单线程里实现多任务的调度,并在单线程里维持多个任务间的切换

2. 并发编程的死锁问题

2.1 死锁产生的原因
  • 资源竞争: 多个线程需要使用相同的资源,并且这些资源只能被一个线程一次性占用。如果一个线程获取了资源A,另一个线程获取了资源B,并且两个线程都在等待对方的资源,就会发生死锁。

  • 资源请求和保持: 一个线程已经持有一个资源,并且在等待获取另一个资源时,不释放已经持有的资源。

  • 资源不可抢占: 资源不能被强制从一个线程中抢占。只有线程自己才可以主动释放已持有的资源。

  • 循环等待: 存在一个线程循环等待资源的情况,例如线程A等待线程B持有的资源,而线程B又等待线程A持有的资源。

2.2 避免死锁的方法
  1. 避免嵌套锁(一个线程获取多个锁): 尽量避免一个线程在持有一个锁的同时再去请求另一个锁。可以通过减少锁的使用来避免死锁。

  2. 使用超时: 在获取锁的时候设置超时,如果超过一定时间没有获取到锁,就放弃请求该锁。这样可以避免线程无限期地等待下去。

    if (lock.tryLock(10, TimeUnit.SECONDS)) {
        try {
            // critical section
        } finally {
            lock.unlock();
        }
    } else {
        // perform alternative action
    }
    

    3.尽量缩短锁的持有时间:尽量缩短持有锁的时间,只在必要的地方加锁,减少在锁内执行的操作

3.资源限制的挑战

3.1 什么是资源限制

        资源限制是指在进行并发编程时,程序的执行速度受限于计算机硬件资源或软件资源例如,服务器的带宽只有 2Mbs,某个资源的下载速度是1Mb/s每秒,系统启动10个线程下载资源,下载速度不会变成10Mb/s,所以在进行并发编程时,要考虑这些资源的限制。硬件资源限制有带宽的上传/下载速度、硬盘读写速度和CPU的处理速度。软件资源限制有数据库的连接数和socket 连接数等。

3.2 资源限制引发的问题

       在并发编程中,将代码执行速度加快的原则是将代码中串行执行的部分变成并发执行但是如果将某段串行的代码并发执行,因为受限于资源,仍然在串行执行,这时候程序不仅不会加快执行,反而会更慢,因为增加了上下文切换和资源调度的时间。例如,之前看到-段程序使用多线程在办公网并发地下载和处理数据时,导致CPU利用率达到100%,几个小时都不能运行完成任务,后来修改成单线程,一个小时就执行完成了。

        强烈建议:如果并发程序写的不严谨,出现问题定位起来比较耗时和棘手java开发工程师尽量还是多使用JDK并发包提供的并发容器和工具类来解决并发问题。(比较jdk大叔的水平可是经历 了历史的检验)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/755703.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于Java的蛋糕预定系统【附源码+LW】

摘 要 当今社会进入了科技进步、经济社会快速发展的新时代。国际信息和学术交流也不断加强,计算机技术对经济社会发展和人民生活改善的影响也日益突出,人类的生存和思考方式也产生了变化。传统购物方式采取了人工的管理方法,但这种管理方法存…

使用 nvm 管理 Node 版本及 pnpm 安装

文章目录 GithubWindows 环境Mac/Linux 使用脚本进行安装或更新Mac/Linux 环境变量nvm 常用命令npm 常用命令npm 安装 pnpmNode 历史版本 Github https://github.com/nvm-sh/nvm Windows 环境 https://nvm.uihtm.com/nvm.html Mac/Linux 使用脚本进行安装或更新 curl -o- …

阿里云服务器数据库迁云: 数据从传统到云端的安全之旅(WordPress个人博客实战教学)

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 文章目录 一、 开始实战1.2创建实验资源1.3重置云服务器ECS的登录密码(请记住密码)1.4 设置安全组端口1…

武汉星起航:跨境热销新趋势,亚马逊美国站与欧洲站选品大赏

亚马逊作为全球领先的电商平台,其美国站和欧洲站一直是全球卖家争相入驻的热门站点。这两个站点不仅拥有庞大的消费群体和完善的物流体系,更以其独特的选品策略吸引了众多消费者的目光。武汉星起航将深入剖析亚马逊美国站和欧洲站当前热销的选品&#xf…

【Qt】之【Bug】大量出现“未定义的标识符”问题

背景 构建时出现大量错误 原因 中文注释问题 解决 方法1. 报错代码附近的中文注释全部删掉。。。 方法2. 报错的文件添加 // Chinese word comment solution #pragma execution_character_set("utf-8")

爱奇艺 Opal 机器学习平台:特征中心建设实践

01 综述 Opal 是爱奇艺大数据团队研发的一站式机器学习平台,旨在提升特征迭代、模型训练效率,帮助业务提高收益。整个平台覆盖了机器学习生命周期中特征生产、样本构建、模型探索、模型训练、模型部署等在内的多个关键环节。其中特征作为模型训练的基石…

ZYNQ MPSOC浅说

1 MPSOC PL端 Zynq UltraScale MPSoC PL 部分等价于 FPGA。简化的 FPGA 基本结构由 6 部分组成,分别为可编程输入/输出单元、基本可编程逻辑单元、嵌入式块RAM、丰富的布线资源、底层嵌入功能单元和内嵌专用硬核等。 2 MPSOC PS端 MPSoC 实际上是一个以处理器为…

Quartz定时任务组件

官网:http://www.quartz-scheduler.org/ 1)job - 任务 - 你要做什么事? 2)Trigger - 触发器 - 做什么事,什么时候触发,可以传入任务 3)Scheduler - 任务调度 - 可以传入多个触发器进行任务调…

软件测试之接口测试(Postman/Jmeter)

🍅 视频学习:文末有免费的配套视频可观看 🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 一、什么是接口测试 通常做的接口测试指的是系统对外的接口,比如你需要从别的系统来…

动手学深度学习(Pytorch版)代码实践 -卷积神经网络-29残差网络ResNet

29残差网络ResNet import torch from torch import nn from torch.nn import functional as F import liliPytorch as lp import matplotlib.pyplot as plt# 定义一个继承自nn.Module的残差块类 class Residual(nn.Module):def __init__(self, input_channels, num_chan…

AI副业赚钱攻略:掌握数字时代的机会

前言 最近国产大模型纷纷上线,飞入寻常百姓家。AI副业正成为许多人寻找额外收入的途径。无论您是想提高家庭收入还是寻求职业发展,这里有一个变现,帮助您掌握AI兼职副业的机会。 1. 了解AI的基础知识 在开始之前,了解AI的基础…

【笔记】Spring Cloud Gateway 实现 gRPC 代理

Spring Cloud Gateway 在 3.1.x 版本中增加了针对 gRPC 的网关代理功能支持,本片文章描述一下如何实现相关支持.本文主要基于 Spring Cloud Gateway 的 官方文档 进行一个实践练习。有兴趣的可以翻看官方文档。 由于 Grpc 是基于 HTTP2 协议进行传输的,因此 Srping …

zabbix监控进阶:如何分时段设置不同告警阈值(多阈值告警)

作者 乐维社区(forum.lwops.cn)乐乐 在生产环境中,企业的业务系统状态并不是一成不变的。在业务高峰时段,如节假日、促销活动或特定时间段,系统负载和用户访问量会大幅增加,此时可能需要设置更高的告警阈值…

vscode 使用正则将/deep/ 替换成 :deep()

在VSCODE编辑器的SEARCH中按上图书写即可,正则表达式如下:(\/deep\/)(.*?)(?\{) 替换操作如下::deep($2) 如果有用,号隔开的用:(\/deep\/)(.*?)(?,)替换操作如下::deep($2) 即可实现快速替换所有/deep/写法; 同理…

Cyuyanzhong的内存函数

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、memcpy函数的使用与模拟实现二、memmove函数的使用和模拟实现三、memset函数与memcmp函数的使用(一)、memset函数(内存块…

一文速览Google的Gemma:从gemma1到gemma2

前言 如此文《七月论文审稿GPT第3.2版和第3.5版:通过paper-review数据集分别微调Mistral、gemma》所讲 Google作为曾经的AI老大,我司自然紧密关注,所以当Google总算开源了一个gemma 7b,作为有技术追求、技术信仰的我司&#xff0…

大模型ReAct:思考与工具协同完成复杂任务推理

ReAct: Synergizing Reasoning and Acting in Language Models Github:https://github.com/ysymyth/ReAct 一、动机 人类的认知通常具备一定的自我调节(self-regulation)和策略制定(strategization)的能力&#xff0…

福昕阅读器再打开PDF文件时,总是单页显示,如何设置打开后就自动显示单页连续的模式呢

希望默认进入连续模式 设置方法 参考链接 如何设置使福昕阅读器每次启动时不是阅读模式 每次启动后都要退出阅读模式 麻烦_百度知道 (baidu.com)https://zhidao.baidu.com/question/346796551.html#:~:text%E5%9C%A8%E3%80%90%E5%B7%A5%E5%85%B7%E3%80%91%E9%87%8C%E6%9C%89%E…

Springboot下使用Redis管道(pipeline)进行批量操作

之前有业务场景需要批量插入数据到Redis中,做的过程中也有一些感悟,因此记录下来,以防忘记。下面的内容会涉及到 分别使用for、管道处理批量操作,比较其所花费时间。 分别使用RedisCallback、SessionCallback进行Redis pipeline …

从零开始学Spring Boot系列-集成Spring Security实现用户认证与授权

在Web应用程序中,安全性是一个至关重要的方面。Spring Security是Spring框架的一个子项目,用于提供安全访问控制的功能。通过集成Spring Security,我们可以轻松实现用户认证、授权、加密、会话管理等安全功能。本篇文章将指导大家从零开始&am…