当前位置:网站首页>【并发】概念
【并发】概念
2022-08-04 06:04:00 【linrui7】
线程上下文
CPU时间片:分配给每个线程执行的时间
CPU在一个时刻只能运行一个线程
线程上下文
A线程时间片结束时,保存上下文信息。
1.寄存器
2.程序计数器:保存执行指令的位置,每个线程之间都有一个独立的程序计数器。
阻塞和唤醒线程
需要操作系统介入,用户态和内核态之间切换,消耗大量资源。
优化
减少线程上下文切换的出现
1.减少锁资源竞争。
2.减少锁持有时间:别的线程会被阻塞
将与锁无关的代码移出同步代码块
3.减少锁的粒度
使用读写锁
锁分解:如concurrentHashMap的桶
4.CAS,非阻塞乐观锁。
5.减少GC频率,垃圾回收时会产生内存碎片,需要移动存活对象。会暂停线程,导致上下文切换。
线程数量
降低延迟,提高吞吐量
单核情况:只有CPU操作时,会增加性能损耗
多核情况:可提高性能
多线程:提高CPU利用率,4核创建4个线程,
理论上,会设置为4+1个,阻塞时,会用这个额外的线程。
I/O密集型
单核最佳线程为: (I/O操作耗时/CPU计算耗时)+1
无锁 CAS原理
compare and swap:连续不被中断的
实现原理:
V 读写值
A 预期值
B 最新值
非阻塞式同步方式。采取自旋等待,更新失败时,不会进入阻塞。不成功会一直循环执行
长时间不成功,会给CPU带来压力
ABA问题,修改后又被改回来。
解决:增加了一个版本号,每次更新后,会递增版本号
synchronized
1.修饰示例方法:对实例的对象进行加锁
2.修饰类的方法:对类对象加锁
3.修饰代码块:锁括号里的对象进行加锁
内部使用monitor监控,monitor里面有计数器,值不为0时,加锁失败,进入阻塞
Lock接口:基于AQS 抽象对象同步器
可重入:ReentrantLock(true:公平锁) 类
需要手动释放锁
核心参数:
计数器:state,为0时,表示没有被占有
所有者线程:exclusiveOwnerThread
对比:
synchronized:非公平锁,粒度较粗,自动释放锁
ReentrantLock:可指定公平还是不是公平的,提供中断等待,手工释放锁。
线程池
1.降级线程使用过程中频繁创建和销毁带来的消耗。
2.对线程统一分配和调用。
3.提高了任务响应速度,无需等待线程创建。
原理:
1.线程池内部,维护一个阻塞队列。
2.线程池内部维护工作线程会消费队列中的任务。
使用:
1.ThreadpoolExecutor类,七大参数
ThreadPoolExecutor(
int corePoolSize, 核心线程数,最小线程数。会一直存活。不会被销毁。
int maximumPoolSize, 最大线程数
long keepAliveTime, 长度,超过这个时间,会被回收
TimeUnit unit, 单位
BlockingQueue<Runnable> workQueue, 工作队列
ThreadFactory threadFactory, 线程工厂,自定义设置
RejectedExecutionHandler handler) 拒绝策略
private static ThreadPoolExecutor executor = new ThreadPoolExecutor(20, 25, 100L,
TimeUnit.SECONDS, new LinkedBlockingQueue<>(), new ThreadPoolExecutor.CallerRunsPolicy());
CallerRunsPolicy:提交的线程自己执行
AbortPolicy:默认拒绝策略,直接丢弃任务,抛出异常:RejectedExecutionException
DiscardPolicy:直接丢弃任务。
DiscardOldestPolicy:丢弃最老的任务,新任务加入到工作队列中
LinkedBlockingQueue:默认最大任务数是:Interger.Max_VALUE
任务越来越多,会导致OOM,内存无法分配空间给新对象。
内存泄漏:申请的内存没有被释放。
内存溢出:申请的超过已有的。
volatile
共享变量,当被一个线程修改了,别的线程会感知该修改操作
会将自己工作内存中的缓存置为失效,强制从内存中读取改共享变量。
通过禁止指令重排,保证有序性
非原子性操作不适用于volatile
使用场景:
1.单例模式
2.程序终止或启动
ThreadLocal
为每一个线程,创建一个自己的变量副本,可以改变自己的副本,不会改变别的副本。
属于当期线程有效。
可能会内存泄漏。
使用完成后,需要置为null进行回收
边栏推荐
- Unable to preventDefault inside passive event listener due to target being treated as passive. See
- DOM的12中节点类型,通过关系或方法获取DOM节点,渲染到浏览器页面的一些特效功能,获取DOM节点来改变属性,点击图片,切换为所点击的图片为背景图,页面上的表单验证,点击底部导航栏切换界面
- 字符串的一些方法
- 反序列化字符逃逸漏洞之
- Error occurred while trying to proxy request项目突然起不来了
- 专题讲座7 计算几何 学习心得
- SQL存储过程详解
- 数据特征预处理——缺失值的查看方式及处理
- MATLAB版量化交易技术分析工具TA-Lib【不付费也可获取,不要被付费吓跑】
- 舍不得花钱买1stOpt,不妨试试这款免费的拟合优化神器【openLU】
猜你喜欢
![(19)[系统调用]SSTD hook 阻止关闭](/img/73/e9d591af366db17965d0bf1cf192b7.png)
(19)[系统调用]SSTD hook 阻止关闭

pycharm专业版使用

Error occurred while trying to proxy request项目突然起不来了

Software: Recommend a domestic and very easy-to-use efficiency software uTools to everyone
![[漏洞问题] log4j漏洞 关于2.17.0升级到2.18.0 方案](/img/f2/2052277ae440279b33248ae51a970f.png)
[漏洞问题] log4j漏洞 关于2.17.0升级到2.18.0 方案

E-R图总结规范

ThreadLocal内存泄漏问题讲解

Provide 和 Inject 的用法

JVM 快速检测死锁

IoU, GIoU, DIoU and CIoU in target detection
随机推荐
app逆向1某联
Different lower_case_table_names settings for server (‘1‘) and data dictionary (‘0‘) 解决方案
SENet detailed explanation and Keras reproduction code
Sql优化总结!详细!(2021最新面试必问)
MMDeploy部署实战系列【第二章】:mmdeploy安装及环境搭建
JVM调优实践
Error EPERM operation not permitted, mkdir ‘Dsoftwarenodejsnode_cache_cacach两种解决办法
SQL存储过程详解
npm包发布与迭代
专属程序员的浪漫七夕
软件稳定性思考
pycharm专业版使用
MySQL内存淘汰策略
mysql月份比較是否相等
如何用matlab做高精度计算?【第三辑】(完)
Activiti 工作流引擎 详解
What is the connection between GRNN, RBF, PNN, KELM?
系统流量预估、架构设计方案
经典新诗九首
错误记录:TypeError: object() takes no parameters