并发编程-第一章 并发编程的挑战
时间:2021-04-17
本文章向大家介绍并发编程-第一章 并发编程的挑战,主要包括并发编程-第一章 并发编程的挑战使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
并发编程的目的:
提高程序的响应速度
充分利用计算机资源
一、上下文切换
现代CPU使用时间片轮转法来进行线程的调度,给每个线程分配固定的时间片,当一个线程时间片用完,就要保存当前线程状态信息,执行其他线程,当再次调度到该线程时,加载线程状态信息,继续执行。
一次上下文切换 = 保存线程状态信息 + 加载线程状态信息
1.1 上下文切换对性能是否存在影响?
从理论上来说,上下文切换会影响程序的执行速度;
1.2 怎么知道发生了上下文切换?
测量上下文切换的时长: Lmbench
测量上下文切换的次数: vmstat
1.3 如何减少上下文切换?
- 无锁并发编程
- CAS 算法
- 使用最小线程
- 使用协程
二、死锁
一个线程正在请求获取一个永远获取不到的锁。
例如:
public static final String lock1 = "lock1";
public static final String lock2 = "lock2";
public static void main(String[] args) throws InterruptedException {
Thread threadA = new Thread(() -> {
synchronized (lock1) {
System.out.println("线程A获取 lock1 锁");
synchronized (lock2) {
System.out.println("线程A获取 lock2 锁");
}
}
});
Thread threadB = new Thread(() -> {
synchronized (lock2) {
System.out.println("线程B获取 lock2 锁");
synchronized (lock1) {
System.out.println("线程B获取 lock1 锁");
}
}
});
threadA.start();
threadB.start();
}
2.1 如何避免死锁?
- 避免一个线程获取多个锁
- 尽量一把锁一个资源
- 使用带计时器的锁
- 对于数据库的锁,加解锁要在一个线程中。
三、资源限制
3.1 什么是资源限制?
资源限制是在进行并发编程时,程序的执行速度受限于计算机软件或硬件资源。
3.2 引发的问题?
因受限于资源,多线程执行并不会加快,反而增加了上下文切换和资源调度的时间。
3.3 如何解决?
硬件资源限制: 使用集群并行执行程序
软件资源限制: 使用资源池将资源复用
3.4 在资源限制下,如何进行并发编程?
根据不同的资源限制调整程序的并发度。
原文地址:https://www.cnblogs.com/chen-jia-cheng/p/14670876.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- PyTorch Trick集锦
- client-go 之 Indexer 的理解
- 你的登录接口真的安全吗?
- Python,你真的会使用 staticmethod 和 classmethod 吗?
- GitLabCI/CD自动集成和部署到远程服务器
- istio-cni详解
- 【Pytorch 】笔记八:Tensorboard 可视化与 Hook 机制
- K近邻算法:以"同类相吸"解决分类问题!
- ROS与PCL中点云数据之间的转换
- 啊,http2还没搞明白,http3又来了?
- 掌握Linux文件权限,看这篇就够了
- 【shell脚本入门到精通】基本规范及良好的编写习惯
- shell脚本的函数介绍使用和常用案例
- 详解shell脚本case条件语句,开发各种服务启动脚本跳板机
- 详解自动交互命令expect,免去手动输入!