并发编程学习笔记

news2025/3/11 17:02:28

为什么学?·

只要去做一个技术含量稍微好点的系统,并发包下面的东西是很容易会要用到的

synchronized(Object){
}

主要是用来给对象加锁  

synchronized底层原理

 首先监视器的计数器是0,然后线程一访问,会将值改为1,此时线程2来访问只能被阻塞,等线程一放弃锁,计数器变为0以后才能访问

锁是可重入的,计数器可以不断加

CAS底层原理:   CAS实现了无锁并发 保证了线程安全

取值,询问,修改

用synchronized  只有一个线程可以成功对myObject加锁,可以对他关联的monitor的计数器去加1,加锁,一但多个线程并发的去进行synchronized加锁,串行化,效果并不好,线程需要排队去执行

 使用CAS   需要 new 一个Atomicinter(()) 

CAS在底层的硬件级别保证一定是原子的,同一时间只有一个线程可以执行cas,先比较再设置,其他线程的CAS同时间去执行会失败

意思就是说,首先读取旧值0,  当我要改的时候,我会查是否还是我读的时候的那个值,如果还是0,那就代表没有人修改,我可以进入,我将它累加为1

线程2此时 也去读取  看是不是还是跟之前的旧值相同     现在这个值 已经是1了  所以进入失败

我重新去读取现在的值    发现是1  那么我现在会再次尝试 将他的值设置成2

其实就是用一个旧值来判断需要修改的值有没有被修改过,如果有人捷足先登,那么我就获取现在的值,累加再重试

ConcurrentHashMap:

场景:多个线程过来,线程1要put的位置是数组【5】,线程2要put的位置是数组【21】map.put(vvv,hh)  明显不好,数组中有很多元素,除非是对同一个元素执行put 不然此时多线程是需要同步的。

1.7之前是分段加锁,每个数组对应一个锁,分段加锁,而1.8以后做了锁粒度的细化

一个大数组,每个元素进行put,都有一个不同的锁,如果两个线程都往数组5里面put,采取的是CAS的策略,同一时间只有一个线程能够成功执行这个CAS

他刚开始先获取数组5的值,null,然后执行CAS,线程1,比较一下,put进去我的这条数据,同时间,其他的线程执行CAS,都会失败。

其实就是用CAS来对数组中的元素进行了加锁,每个元素一把锁,按元素来分段加锁,而不是按数组,  提高了并发能力

AQS实现原理

非公平锁:

公平锁:

 

在CAS的进行过程中,线程的排队是依靠一个队列来完成的  即AQS,

线程1执行完代码 释放锁后,会唤醒线程2,但是默认是非公平的,如果突然半路上杀出来一个线程X来获取锁,此时锁会被X抢占  

 是可以将非公平锁改为公平锁的 

线程池的工作原理:

系统是不会无限去创建很多的线程的,会创建一个线程池,有一定数量的线程,让他们去执行各种各样的任务,线程执行完任务后,不会销毁自己,而是让他等待执行下一个任务

我持续提交任务,只要线程池中的线程数量小于corePoolSize,就会创建新线程来执行这个任务,执行完了就尝试从无界队列获取任务,知道线程池里面有corePoolSize个线程,  接着再次提交,发现线程数量已经有corePoolSize个了,此时就直接吧任务放入队列中即可,线程会争抢获取任务执行,如果所有的线程都在执行任务,那么无界队列中的任务会越来越多

 

线程池核心配置参数:

corePoolSize:3

maximumPoolSize:200

keepAliveTime:60s

new ArrayBlockingQueue<Runnalbe>(200)

如果任务队列中的任务数量实在太多,那么,会创建一些额外的线程出来,但是数量不会大于maximumPoolSize  

如果队列中的任务处理完了,额外的线程空闲出来了,那么超过一定的时间后,会自动销毁掉

如果河外线程去用来处理任务了,但是队列中还是满的,那么会开启拒绝策略,去抛弃掉一些队列中的任务

如果在线程池中使用无界阻塞队列会发生什么问题?

在调用服务的情况下,如果服务调用异常,可能会导致线程调用服务超时,无界阻塞队列变得越来越大,内存飙升,可能还会导致OOM内存溢出

如果线程池中队列满了,会发生什么?

有界队列,可以避免内存溢出

如果让队列满的情况下 无限制创建线程, 那么可能会因为线程过多,占用的栈内存资源过多,而导致内存资源耗尽,导致系统奔溃

即使内存没有奔溃也会使cpu load特别高

如果线程池无法完成更多的任务,那么我就自定义一个reject策略

此时我可以将这个任务信息持久化写入磁盘中,后台专门启动一个线程,后续等待线程池工作负载降低了,再慢慢从磁盘中读取之前持久化的任务,重新提交到线程池中

如果线上机器突然宕机,,线程池的阻塞队列中的请求怎么办?

必然会导致线程池中的积压的任务会丢失

要提交一个任务到线程池之前,在提交之前,我先在数据库中插入这个任务的时候,标注一下,这个任务是未提交、已提交、未完成、已完成。提交成功之后 更新他的状态是已提交状态。

系统重启后,后台线程去扫描数据库中未提交和已提交状态的任务,可以把任务的信息读取出来在重新提交到线程池中去,继续进行执行。

JAVA内存模型:

JAVA内存模型中的原子性、有序性、可见性是什么?

java内存模型->原子性、有序性、可见性->volatile->内存屏障

没有可见性:并不是 现在线程一把 num 从0改成1 线程二马上就能看到的   

有可见性:具备可见性是 现在线程一修改了之后  线程二马上会去读线程一的修改 马上就能看到、

原子性:就是一次只干一件事,谁也不能影响这件事的发生,这件事是一杆到底的,是一气呵成的。

没有有序性:代码是这样的,但是在执行过程中可能会造成指令重排  重排就导致代码顺序乱了

有有序性:代码指令不会重排

volatile的原理

volatile主要是用来解决可见性和有序性的

加上了volatile关键字后,更新后会将更新的值刷回主存,并且让其他线程中缓存的值失效掉。

主要是保证变量的可见性

你知道指令重排与happens-before原则吗?

指令重排是指的  在多线程环境下  指令并没有按照原有的顺序来执行

happens-before原则:

程序次序规则:一个线程内,按照代码顺序,书写在前面的操作先行发生于书写在后面的操作

锁定规则:一个Unlock操作线性发生于后面对同一个锁的lock操作,比如说在代码里有先加锁 再解锁  再加锁

volatile变量规则:对一个volatile变量的写操作线性发生于读操作,必须保证是先写 再读

总结:规则制定了在一些特殊情况下,不允许编译器指令器,对程序员写的代码进行指令重排,必须保证代码的有序性、

volatile是如何基于内存屏障保证可见性和有序性的?

线程一修改缓存中的变量值->通过lock指令写回主存

其他线程->通过嗅探机制发现自己缓存的变量值已经被修改->让自己的缓存失效->下次要读的话,只能强制从主存中读取

volatile禁止指令重排  靠的就是volatile

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[Gitops--4] OpenELB

OpenELB OpenELB是一个开源的负载均衡器,功能和metalLB类似 OpenELB主要两种工作模式: Layer2和BGP模式.目前OpenELB的BGP不支持ipv6 OpenELB核心思想就是通过某种方式将特定的VIP的流量引导k8s集群中,然后通过Kube-proxy将流量转发到后面的特定服务. 1. OpenELB介绍 1.1 La…

对于python文件,敲下回车后发生了什么

引言 我们常说 Python 一是门解释型语言&#xff0c;只需要敲下 python code.py就可以运行编写的代码&#xff0c;而无需使用类似于 javac 或者 gcc 进行编译。那么&#xff0c;Python 解释器是真的一行一行读取 Python 源代码而后执行吗? 实际上&#xff0c;Python 在执行程序…

为什么要进行倾斜摄影三维模型的顶层合并?

为什么要进行倾斜摄影三维模型的顶层合并&#xff1f; 1、倾斜摄影三维模型顶层合并的重要性 倾斜摄影三维模型的顶层合并是指将拍摄同一区域的多个倾斜角度的影像进行融合&#xff0c;生成一个连续的、完整的三维地理信息数据。其原因主要有以下几点&#xff1a; &#xff0…

关于倾斜摄影三维模型轻量化数据大小和质量关系分析

关于倾斜摄影三维模型轻量化数据大小和质量关系分析 倾斜摄影三维模型轻量化是一种常用的技术&#xff0c;通过对原始三维模型数据进行压缩和简化&#xff0c;减小其数据大小&#xff0c;从而提高数据传输和展示效率。然而&#xff0c;轻量化过程中可能会对数据质量产生影响。以…

性能测试——安装Loadrunner11.0的详细步骤

一、下载Loadrunner11.0版本 去相关网站下载即可 二、安装 &#xff08;windows与虚拟机上安装操作大相径庭&#xff09; 1、将ISO文件导入&#xff0c;打开光驱&#xff0c;运行“setup.exe“ 2、点击安装&#xff0c;部分机器会提示缺少“Microsoft Visual C 2005 SP1运行组…

有效的字母异位词

给定两个字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是 s 的字母异位词。 注意&#xff1a;若 s 和 t 中每个字符出现的次数都相同&#xff0c;则称 s 和 t 互为字母异位词。 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetco…

Java 将json中key值中带有下划线的部分转为驼峰格式

一、背景说明 在开发过程中&#xff0c;有时会遇到第三方厂商提供的接口返回结果不是严格按照驼峰命名&#xff0c;需要将其中带有下划线的字段进行格式化转换为驼峰命名。 如下图中的self_auth、user_id、user_name、creator_name 和 others_auths 等 key 值。 如果是对 JS…

Mysql 45讲和45问笔记(未完待续0203/04/24)

一、mysql 45讲 1&#xff09;索引的本质讲解 定义解释 所以是帮助Mysql高效获取数据的排好序的数据结构 索引数据结构 ①二叉树 ②红黑树 ③Hash表 ④B-Tree 原理讲解 可以看到右边的数据结构里面&#xff0c;是按照k-v来存数据结构的&#xff0c;key是col2的字段&#xf…

【Linux】线程-线程概念

线程概念 什么是线程线程的优点和缺点线程的用途和线程异常线程与进程的区别 什么是线程 实际上&#xff0c;线程是一个进程内部的控制序列&#xff0c;一个程序的一个执行线路就是一个线程。 并且一个进程中至少有一个线程&#xff0c;本质上&#xff0c;一个进程内部如果有多…

6. 树的入门

6. 树的入门 之前我们实现的符号表中&#xff0c;不难看出&#xff0c;符号表的增删查操作&#xff0c;随着元素个数N的增多&#xff0c;其耗时也是线性增多的&#xff0c;时间复杂度都是O(n),为了提高运算效率&#xff0c;接下来我们学习树这种数据结构。 6.1 树的基本定义 …

MybatisPlus-入门项目搭建、SQL日志打印、实体类注解、简单持久层操作

Mybatis-Plus mybatis plus概述 ​ Mybatis Plus &#xff08;opens new window&#xff09;简称 MP&#xff0c;它是一个MyBatis 的增加工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。 Mybatis Plus官网&#xff1a;https://…

拉格朗日函数对偶问题、KKT条件

一、概念介绍 KKT最优化条件是Karush(1939)以及Kuhn和Tucker(1951)先后独立发表出来的&#xff0c;但在Kuhn和Tucker发表之后才逐渐受到重视&#xff0c;因此多数情况下记载成库恩-塔克条件(Kuhn-Tucker conditions)。先介绍几个优化的概念。 1.1 优化 最优化问题&#xff0…

大彩串口屏新品发布:大彩7寸新品RS485/232双通讯口人机界面发布!

一、产品介绍 新品发布&#xff1a;大彩7寸新品RS485/232双通讯口人机界面发布&#xff01; 此次发布7.0寸外壳HMI产品采用普清800*480液晶屏、触摸选用电阻触摸&#xff0c;硬件性能上与M型医用级组态串口屏一样&#xff0c;软件上拥有炫酷的动画效果&#xff0c;页面切换流…

路侧激光雷达目标检测系统-篇2

本篇文章承接上文&#xff0c;主要阐述代码&#xff0c;分布的成果等工作。识别结果为单帧图片&#xff0c;每一张图片识别完之后&#xff0c;放在一起&#xff0c;就可以连续播放单帧文件&#xff0c;变成视频&#xff0c;或者直接在matlab图窗里面播放。关于这个函数的功能我…

HTML+CSS+JS 学习笔记(三)———Javascript(中)

&#x1f331;博客主页&#xff1a;大寄一场. &#x1f331;系列专栏&#xff1a;前端 &#x1f331;往期回顾&#xff1a;HTMLCSSJS 学习笔记&#xff08;三&#xff09;———Javascript(上) &#x1f618;博客制作不易欢迎各位&#x1f44d;点赞⭐收藏➕关注 目录 JavaScrip…

NLP_什么是统计语言模型_条件概率的链式法则_n元统计语言模型_马尔科夫链_统计语言模型的平滑策略---人工智能工作笔记0035

https://www.cnblogs.com/nickchen121/p/16470569.html#tid-458p3Y 参考这个文档学习 条件概率的链式法则:这个是需要去补充的知识. 首先我们来看一下上一节说到的预训练,可以看到,我们比如有个鹅鸭的分类问题, 这个鹅鸭分类我们是用10万张图片训练的模型,这个已经可以把这个…

3. 马氏决策过程

3. 马氏决策过程 3. 马氏决策过程3.1 马氏过程3.2 马氏奖励过程3.3 马氏决策过程3.4 贝尔曼方程与最优值 3. 马氏决策过程 3.1 马氏过程 3.2 马氏奖励过程 3.3 马氏决策过程 3.4 贝尔曼方程与最优值

如何从有故障的 SD 卡恢复文件

如何从损坏的 SD 卡中恢复文件&#xff1f; 您是否正在与损坏的 SD 卡作斗争&#xff1f;您的 SD 卡上是否有您无法承受的数据丢失&#xff0c;但它没有响应&#xff1f;好吧&#xff0c;我们为您解决了&#xff01; SD 卡是智能手机、相机和笔记本电脑中常用的存储设备。虽然…

2. 多臂老虎机问题

多臂老虎机问题 2. 多臂老虎机问题2.1 强化学习基本概念2.2 多臂老虎机与regret值2.3 随机多臂老虎机2.4 对抗多臂老虎机2.5 上下文多臂老虎机2. 多臂老虎机问题 2.1 强化学习基本概念 2.2 多臂老虎机与regret值

SpringCloud入门实战(七)-Hystrix入门简介

&#x1f4dd; 学技术、更要掌握学习的方法&#xff0c;一起学习&#xff0c;让进步发生 &#x1f469;&#x1f3fb; 作者&#xff1a;一只IT攻城狮 。 &#x1f490;学习建议&#xff1a;1、养成习惯&#xff0c;学习java的任何一个技术&#xff0c;都可以先去官网先看看&…