并发编程的挑战

2023-10-27

上下文切换

概念

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

种类

当某一任务自愿放弃它的 CPU 时间或者系统分配的时间片用完时,就会发生上下文切换,上下文切换又分为让步式上下文切换和抢占式上下文切换前者是指执行线程主动释放CPU,与锁竞争严重程度成正比,可通过减少锁竞争来避免;后者是指线程因分配的时间片用尽而被迫放弃CPU或者被其他优先级更高的线程所抢占,一般由于线程数大于CPU可用核心数引起,可通过调整线程数,适当减少线程数来避免

减少上下文切换

  • 无锁并发编程:多线程竞争锁时会引起上下文切换,多线程处理数据时可以用一些办法来避免使用锁
  • CAS算法:使用CAS算法来更新数据,不需要加锁
  • 使用最少线程:避免创建不需要的线程,比如任务很少,但创建很多线程来处理,会造成大量线程处于等待状态
  • 协程:在单线程里实现多任务调度

死锁

死锁案例

package day01;

public class DeadLockTest {
    private Object lock1=new Object();
    private Object lock2=new Object();

    public void deadLock(){
        new Thread(()->{
            synchronized (lock1){
                try {
                    Thread.sleep(1000);
                }catch (InterruptedException e){
                    e.printStackTrace();
                }
                synchronized (lock2){
                }
            }
        }).start();

        new Thread(()->{
            synchronized (lock2){
                try {
                    Thread.sleep(1000);
                }catch (InterruptedException e){
                    e.printStackTrace();
                }
                synchronized (lock1){
                }
            }
        }).start();
    }

    public static void main(String[] args) {
        new DeadLockTest().deadLock();
    }
}

避免死锁

  • 避免一个线程同时获得多个锁
  • 避免一个线程在锁内部同时占用多个资源,尽量保证每个锁占用一个资源
  • 尝试使用定时锁
  • 对于数据库锁,加锁和解锁必须放在一个数据库连接里

参考书籍:《Java并发编程的艺术》

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

并发编程的挑战 的相关文章

随机推荐

  • Linux 信号(三) —— 强大的sigaction

    在Linux中 对于信号的收发有着两组函数 1 入门版 发送函数 int kill pid t pid int sig 接收函数 sighandler t signal int signum sighandler t handler 这组函
  • MyBatis进阶版

    本文有点难 目录 1 一些区分 1 1参数占位符 和 1 1 1SQL注入 1 1 2like查询 1 2resultType和resultMap 2 映射查询 2 1一对一表映射 2 2一对多表映射 3 动态SQL 3 1标签 3 2标签
  • esp32使用fft算法显示音乐频谱

    演示参考下方视频 源码链接在视频末尾获取 点击查看视频 介绍 本项目使用esp32s3 ifd4 2 声音传感器以及tft显示屏构成 使用快速傅里叶变换算法处理采集到的音频数据 fft处理后的数据使用lvgl显示在tft屏幕上 电路图 源码
  • SpringBoot MongoDB批量删除指定日期前的文件

    SpringBoot MongoDB批量删除指定日期前的文件 Query query new Query LocalDateTime localDateTime LocalDateTime of 2021 6 1 0 0 0 query a
  • 《动手学深度学习 Pytorch版》 2.1 数据操作

    2 1 1 数据操作 注意此处 import 的不是 pytorch 而是 torch Torch 是采用 lua 语言实现的 从某种程度上说 PyTorch 是 Torch 的 Python 版本 当然还是有部分差别的 import to
  • python学生分布_python统计函数库scipy.stats的用法解析

    背景 总结统计工作中几个常用用法在python统计函数库scipy stats的使用范例 正态分布 以正态分布的常见需求为例了解scipy stats的基本使用方法 1 生成服从指定分布的随机数 norm rvs通过loc和scale参数可
  • CDUA 图形学 Texture Reference 实验

    下面是对Texture Reference的实验 代码改自 CUDA C PROGRAMMING GUIDE PG 02829 001 v10 0 October 2018 p54 因为这里比较贴近计算机图形学 故移到图形学中去 版权所有
  • Java基础面试题一:请说说抽象类和接口的区别?

    1 抽象类实例 abstract class person public String name 可以有普通成员变量 public static String sex 可以有静态成员变量 public static void eat 可以有
  • 用GDB跟踪观察共享库函数的地址翻译过程

    用GDB跟踪观察共享库函数的地址翻译过程 用GDB观察共享库函数的翻译过程 研究了一下共享库函数是怎样加载到当前进程中的 开始共享库函数地址放在GOT中 第一次调用时 ld将其翻译成函数在程序空间的真实地址 用GDB跟踪了一下整个过程 记录
  • 宋浩概率论笔记(二)随机变量

    本章节内容较多 是概率论与数理统计中最为重要的章节 对于概率密度和分布函数的理解与计算要牢牢掌握 才能在后期的学习中更得心应手
  • 安装docker后启动报错Failed to set version to docker-desktop: exit code: -1

    背景 我想用PC Windows 上的VS code连接远程服务器 Linux 内的docker容器 这样能用编辑器editor修改文件 更加方便 VS code的插件remote container能达到这一目的 按照它的指示guide
  • 性能自动化测试

    性能自动化测试 1 为什么要做性能测试 2 什么是性能测试 3 性能测试分类 1 压力测试 2 负载测试 3 配置测试 4 基准测试 5 并发测试 6 容量测试 7 稳定性测试 4 什么时候需要进行何种性能测试 5 性能测试常见指标 1 响
  • Iterable的常见方法以及含义

    1 Iterable Iterable是java集合接口的顶级接口之一 这是这个接口中的iterator方法 用来返回一个实现了Iterator接口的对象 1 1Iterator接口中的方法 1 1 1forEachRemaining方法
  • MultipartFile.transferTo(dest) 报找不到文件

    MultipartFile transferTo dest 报找不到文件 今天使用transferTo这个方法进行上传文件的使用发现了一些路径的一些问题 查找了一下记录问题所在 前端上传网页 使用的是单文件上传的方式
  • C++调用C函数

    前言 以前见到extern C 这样的语句 只是简单地知道跟外部链接有关 但是没有深刻理解它的意思 首先 为什么要使用extern C 修饰符 C 调用其它语言的函数 由于编译器生成函数的机制不一样 所以需要经过特殊处理 才可以调用 调用C
  • SQL 四种语言基本操作

    SQL Structured Query Language 结构化查询语言 SQL主要4个部分 数据定义类SQL DDL DATE DEFINITION LANGUAGE CREATE 创建数据库及其对象 表 索引 视图 存储过程 函数和触
  • 线索二叉树的先序、中序、后序

    线索二叉树的先序 中序 后序 Name 线索二叉树 Copyright Author lkm Date 30 09 21 14 50 Description include
  • 几种优化算法的比较(BGD、SGD、Adam、RMSPROP)

    前言 这里讨论的优化问题指的是 给定目标函数f x 我们需要找到一组参数x 使得f x 的值最小 本文以下内容假设读者已经了解机器学习基本知识 和梯度下降的原理 Batch gradient descent 梯度更新规则 BGD 采用整个训
  • 目标检测中的MAP的计算(逐步推导)

    目标检测中的MAP的计算 逐步推导 概念介绍 首先放一下前面一篇博文中提到的precision和recall的计算公式和概念 P precision TP TP FP 在目标检测中就是检测出的所有框中预测正确的比例 R recall TP
  • 并发编程的挑战

    文章目录 上下文切换 概念 种类 减少上下文切换 死锁 死锁案例 避免死锁 上下文切换 概念 CPU通过时间片分配算法来循环执行任务 当前任务执行一个时间片后会切换到下一个任务 在切换前会保存上一个任务的状态 以便下次切换回这个任务时可以再