第二天并发篇

一、线程状态
1.新建(New):创建线程对象时
2.就绪(Runnable):线程调用start方法,有执行资格没有执行权
3.运行:当就绪状态时抢到cpu的执行权之后,进入运行状态
4.阻塞(Blocked):当获取锁失败后,进入阻塞状态
5.等待(Waiting):等待被notify()方法唤醒
6.休眠(sleep):休眠一段时间,时间到了之后,进入就绪状态。
7.终止(Terminated):线程死亡

 

二、线程的七大参数
1.核心线程数(corePoolSize):表示保持活动状态的最小线程数。
2.最大线程数(maximumPoolSize):表示允许创建的最大线程数。
3.空闲时间(keepAliveTime):表示当线程数量超过核心线程数时,多余的空闲线程能够保持存活的时间。
4.阻塞队列(workQueue):表示用于存储等待执行的任务的阻塞队列。
5.单位(unit):表示空闲时间的单位,例如毫秒、秒等。
6.拒绝策略(rejectedExecutionHandler):表示当任务无法提交给线程池执行时采取的策略。
当线程任务进来时,首先尝试创建核心线程进行执行。如果线程池中的线程数量已经达到了核心线程数,
并且阻塞队列也已经满了,那么就会尝试创建新的线程进行执行。
如果线程池中的线程数量已经达到了最大线程数,并且阻塞队列也已经满了,那么就会执行拒绝策略。

示例:假设线程池的核心线程数为 10,最大线程数为 20,阻塞队列容量为 50,
则当有 100 个任务进入线程池时,会有 10 个核心线程立刻执行任务,50 个任务进入阻塞队列,
再有 10 个线程被创建并立即执行剩余的任务。最后还剩下 30 个任务无法执行,就会被拒绝执行。


三、wait 和 sleep的区别?
1.相同点:wait(long) 和 sleep(long) 的效果都是让当前线程暂时放弃 CPU 的使用权,进入阻塞状态
2.不同点:
 2.1方法归属不同:

 sleep是Thread的静态方法,而 wait()都是 Object 的成员方法,每个对象都有
 2.2醒来时间不同:sleep方法是暂停当前线程,相当于休眠一段时间,之后会自动唤醒,而wait()必须被notify 或者notifyall方法唤醒,不然会一直阻塞
 2.3锁特性不同:wait方法的调用必须先获取wait对象的锁,而sleep则无此限制
;wait方法执行后会释放对象锁
 允许其它线程获得该对象锁(我放弃 cpu,但你们还可以用);如果在 synchronized代码块中执行,并不会释放对象锁(我放弃 cpu,你们也用不了)

四、lock与synchronized的区别
1.语法层面:
1.1.synchronized是关键字,源码在jvm中,用c++ 语言实现

1.2.Lock 是接口,源码由jdk 提供,用java语言实现

1.3.使用 synchronized 时,退出同步代码块锁会由jvm自动释放,而使用Lock时,需要手动调用unlock方法释放锁,否则可能会导致死锁等问题。

2.功能层面
相同点:
2.1都可以用来控制多个线程访问共享资源的互斥性。
2.2都支持可重入锁机制,即同一个线程在已经获得锁的情况下能够再次获取该锁。
2.3都支持在发生异常或者代码执行完毕时自动释放锁资源,避免死锁等问题。
不同点:
2.4 Lock 提供了更多的锁机制选择,例如公平锁、非公平锁、可重入锁、读写锁等多种类型;而 synchronized 只有一种类型,即独占锁(排他锁)。
2.5 Lock 应该优先考虑在高并发场景下使用,可以获得更好的性能和灵活性;而 synchronized 关键字则更适合用于简单的线程同步场景,易于使用和维护

五、volatile

1.volatile是java中的关键字,可以保证变量的可见性和禁止指令重排序优化
2.volatile不能保证复合操作的原子性,使用时需要注意
3.使用volatile的情况:多个线程访问共享变量、共享值经常变化、对变量写操作不依赖当前值、实现简单的线程同步机制
4.缺点:内容开销较大、可能导致程序执行效率降低。

六、悲观锁与乐观锁
1.什么是悲观锁和乐观锁?
悲观锁:假设会出现并发冲突,因此在访问共享资源时先加锁,防止其他线程修改数据,
        悲观锁示例:synchronized锁(jvm)和Lock(jdk接口)锁
乐观锁:假设不会出现并发冲突,因此在访问共享资源时先不加锁,在提交更新时检查数据是否被其他线程修改过,
        乐观锁示例:1.基于CAS算法实现:AtomicReference类,内部使用 CPU 提供的原子性操作来实现并发控制2.版本号机制:在数据表中增加一个版本号字段,每次更新时检查版本号是否一致,若不一致则表示数据已被其他线程修改过。
2.悲观锁和乐观锁的优缺点
   悲观锁:优点是可以保证数据的一致性,缺点是在高并发场景下可能会出现资源竞争导致的性能问题。
   乐观锁:优点是可以提高系统的并发能力,缺点是可能会出现数据不一致的情况,需要进行补偿机制或者重试机制等。

3.场景:

        悲观锁适用于写操作较多的场景,例如数据库的 UPDATE、DELETE 操作等,因为这些操作可能会对数据产生破坏性的影响。
        乐观锁适用于读操作较多的场景,例如缓存系统的 GET 操作等,因为这些操作不会对数据产生破坏性的影响。

七、hashmap与concurrentHashmap的区别?
1.线程安全性:
        HashMap是非线程安全的,多线程并发访问会导致数据不一致问题,而ConcurrentHashMap则采用分段锁的思想,在底层数据结构中将数据分为多个段(Segment),
每个段都有自己的,因此可以保证并发访问时的线程安全性
2.并发性:
        由于ConcurrentHashMap在内部使用了分段锁,因此在高并发场景下可以保证更好的性能表现和吞吐量。而HashMap由于没有使用任何锁机制,因此在高并发的环境下容易出现并发冲突和性能瓶颈。
3.内部实现:
        HashMap的内部实现采用的是链表和红黑树等数据结构来解决哈希冲突问题,而ConcurrentHashMap则采用分段锁和CAS算法

注意:虽然ConcurrentHashMap的性能表现更优秀,但是在一些特定的场景下由于锁的竞争,可能会导致出现等待的情况,需根据实际需求选择。

八、THreadLocal原理
  每个 ThreadLocal 实例内部都有一个 Map,用于存储数据。
在默认情况下,这个 Map 是由 ThreadLocal 创建的,
并且存储在当前线程的 ThreadLocalMap 属性中。
当调用 ThreadLocal 的 set() 方法设置值时,实际上是先获取当前线程的 ThreadLocalMap 对象,
然后将 ThreadLocal 实例作为 key,要设置的值作为 value 存入 Map 中。当调用 get() 方法获取值时,实际上是先获取当前线程的 ThreadLocalMap 对象,然后获取 Map 中对应 ThreadLocal 实例的值。
注意点:使用 ThreadLocal 时需要注意内存泄漏问题
如果 ThreadLocal 实例被创建后没有被清理,那么就会存在大量无效的 ThreadLocal 实例和对应的 Map,导致内存占用过高。
可以通过使用 remove() 方法或者将 ThreadLocal 实例声明为静态变量并在不需要时手动清理来避免内存泄漏问题。

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

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

相关文章

过程控制系统中的模块技术MTP

在过程自动化行业中,模块化设备概念近年来越来越受欢迎。其中最热门的是MTP。MTP称为模块类型封装,它是过程工业自动化技术用户协会(NAMUR)提出的过程自动化行业的模块化标准,通过这种模型,开发工作的重点从…

C++(Qt)软件调试---linux下生成/调试Core文件(3)

#软件调试 C(Qt)软件调试—linux下生成/调试Core文件(3) 文章目录C(Qt)软件调试---linux下生成/调试Core文件(3)前言1、C生成Core和使用GDB调试1、环境2、C生成Core文件3、使用gdb工具调试core可定位段错误位置;4、修…

【创作赢红包】你是真的“C”——C语言中文件操作函数使用的详细讲解【上篇】

你是真的“c”——C语言中文件操作函数使用的详细讲解~😎前言🙌一、 为什么使用文件:🙌二、 什么是文件:🙌2.1 程序文件2.2 数据文件2.3 文件名3. 文件的打开和关闭3.1 文件指针3.2 文件的打开和关闭4. 文件…

【ansible】实施任务控制

目录 实施任务控制 一,循环(迭代)--- loop 1,利用loop----item循环迭代任务 2,item---loop循环案例 1,定义item循环列表 2,通过变量应用列表格式 3,字典列表(迭代嵌套子…

一个ESP32小东西

之前发了ESP8266,有人评论说玩下ESP32然后就买了几个回来,当然,也想着和大家一起玩介绍下这个开发板开发板Github项目链接https://github.com/Xinyuan-LilyGO/T-QT把仓库的代码下载到本地我们可以用ESP-IDF和Arduino两个SDK来开发ESP32S3ESP-…

回溯算法思想、回溯算法解题模板与回溯算法题目索引(不断更新)

回溯算法 回溯算法是一种试探性的搜索算法,它在解决某些组合问题、优化问题、路径问题等,非常有效。回溯算法的核心思想是通过递归和深度优先搜索(DFS)来搜索问题的解空间。 细说一下这些问题: 组合问题:N…

初级网络工程师这30道面试题一定得会,建议小白收藏!

你好,这里是网络技术联盟站。 后台有小伙伴想让瑞哥整理一下初级网络工程师面试题,今天我整理出来了,针对初级网络工程师,我们在面试的时候主要考察的是基础概念,下面列举的希望大家可以收藏,平时多看看&a…

活动选择问题 | 贪心算法 1

贪心法是一种算法范式,它逐个构建解决方案,始终选择下一个提供最明显和最直接好处的部分。贪心算法用于优化问题。 如果问题具有以下属性,则可以使用 Greedy 解决优化问题: 在每一步中,我们都可以做出当前看起来最好…

MongoDB 6.0 (四)聚合操作

一、 聚合框架的作用 1. 什么是MongoDB 聚合框架 MongoDB 聚合框架(Aggregation Framework)是一个计算框架,它可以: • 作用在一个或几个集合上; • 对集合中的数据进行的一系列运算; • 将这些数据转化为期望的形式; 从效果而言,聚合框架相当于SQL 查询中的: …

【Mysql系列】——详细剖析数据库“索引”【上篇】

【Mysql系列】——详细剖析数据库中的核心知识【索引】😎前言🙌索引索引概述为什么需要索引?索引的优缺点索引结构索引的结构为什么不是二叉树和红黑树?索引的B树结构索引的Hash结构Hash结构索引的特点思考:为什么Inno…

MySQL中多表查询(多表关系:一对多、多对多、一对一,分类:连接查询:内连接、外连接、自连接、联合查询,子查询:标量子查询、列子查询、行子查询、表子查询)

多表关系: 一对多: 多对多: 一对一: 我们发现我们利用DQL中的select语句查询多张表的时候,会出现一个数学现象,叫做笛卡尔积 因此我们可以加上where语句来限定条件: 内连接: 此处in…

计算机网络面试八股文攻略(一) —— OSI 七层模型

一、简述 本系列将对面试中与计算机网络相关的知识进行讲解与分析。 本篇为 OSI 七层网络模型的相关知识。 二、概念 OSI 七层网络模型是国际标准化组织(ISO)制定的一个用于计算机或通信系统间互联的标准体系。它是一个七层的、抽象的模型体&#xff…

A Causal Debiasing Framework for Unsupervised Salient Object Detection

背景知识 显著性检测 简单就是使用图像处理技术和计算机视觉算法来定位图片中最“显著”的区域。显著区域就是指图片中引人注目的区域或比较重要的区域,例如人眼在观看一幅图片时会首先关注的区域。 chatGPT4的回答 计算机视觉中的显著性检测(Visual…

从事6个月软件测试,目前只会功能测试迷茫了...

前言 (来自一位粉丝的投稿)来这个公司大半年,现在主要做的是类似于淘宝的购物商城,以前也做应用系统什么的,可是感觉公司的软件测试岗位都是不着边的,因为做的都是功能测试,来了这么久,没接触过技术性的东…

美丽苏大,清华博士,年轻硕导,招收研究生了!

Datawhale学术 导师:张正超,苏州大学,Datawhale成员导师信息本人于2022年取得清华大学博士学位,目前是苏州大学计算机科学与技术学院的硕士生导师,2023年可招收计算机科学与技术、软件工程、人工智能及大数据技术与工程…

微服务保护Sentinel一站式学习

微服务保护Sentinel 雪崩问题 解决雪崩问题的四种常见方式: 超时处理:设定超时时间,请求超过一定时间没有响应就返回错误信息,不会无休止等待。如果设置一秒钟没响应返回,即1s释放连接,这1s中有好多个请求…

BOSS直拒、失联招聘,消失的“金三银四”,失业的测试人出路在哪里?

裁员潮涌,经济严冬。最近很多测试人过得并不好,行业缩水对测试岗位影响很直接干脆,究其原因还是测试门槛在IT行业较低,同质化测试人员比较多。但实际上成为一位好测试却有着较高的门槛,一名优秀的测试应当对产品的深层…

Stable Diffusion 视频和图片帧互换以及AI动画帧生成

Stable Diffusion 只做AI动画是基于把原有视频按照帧进行提取之后对每一帧的图像进行标准化流程操作,中间可以掺杂Controlnet对人物进行控制,使用关键词对画面进行控制,但是很多小伙伴不太会掌握一些编辑视频软件或者python的操作导致视频转帧…

Java 深入理解Servlet

动态资源与静态资源区别 servlet三及相关接口简介servet 执行过程servlet路径映射servlet生命周期(重点) --理解(重点)Servlet自动加载Servlet线程安全Servlet相关接口详解ServletContext对象 --知识点 一、Web项目结构 |- WebRoot : web应用的根目录…

【linux】常用命令大全(入门必备)

这篇文章涵盖了linux中常用的所有指令,欢迎大家阅读查询。(如有不正确的地方,各位大佬可以在评论区指出,我会及时进行更正)。 文章目录登录远程服务器ssh添加删除用户当前路径pwd列出文件目录ls进入cdtreewhoami创建文件touch创建目录mkdir删…