每天一学(2)

目录

        1、线程池是如何知道线程任务是否完成

        2、阻塞队列的有界和无界

        3、ConcurrentHashMap底层实现原理

        5、CAS机制

        6、wait 和 notify 为什么要放在 synchronized


        1、线程池是如何知道线程任务是否完成

        线程池内部

        当把任务丢给线程池去执行,调度工作线程, 通过同步调用执行 run () 方法,正常结束, 等待方法返回 直到结束,

        线程外部:  

        线程池提供了isInterrupted() 方法 判断线程池的运行状态 结果是 意味着任务执行完成 submit 方法 通过 future.get() 方法 正常返回 意味着结束 没有返回则一直执行

        引入CountDownLatch计数器 进行倒计时 有两个方法 :

        1、await()阻塞线程

         2、countDown() 进行倒计时,一旦倒计时归零,所有阻塞在await()方法的线程都会被释放

       2、阻塞队列的有界和无界

        阻塞队列是特殊的队列,1、当队列为空,获取队列中元素的消费者线程,它会被阻塞,同时唤醒生产者线程,2、当队列中元素满了,向队列中添加元素的生产者线程,它会被阻塞,同时唤醒消费者线程。

        有界队列: 阻塞队列中容纳的个数是有限的,比如去实例化一个ArrayBlockingList ,可以在构造方法传一个整形的数字,表示基于数组的阻塞队列中,能够容纳的元素个数,称为

        无界队列:就是没有设置固定大小的队列,并不是没有任何限制,而是元素存储量很大。无界队列存在比较大的潜在风险,并发量较大的情况下,线程池中几乎可以无限制的添加任务,容易导致内存溢出。

        3、ConcurrentHashMap底层实现原理

        整体架构:

        jdk1.8 由数组+红黑树+单向链表构成,默认初始化长度16的数组,由于核心仍是hashmap ,必然会存在hash冲突, 所有ConcurrentHashMap采用链式寻址的方式

        解决hash 冲突:当hash冲突比较多的时候,会造成链表长度问题, jdk 1.8 引入红黑树,当数组长度大于64,并且链表长度大于8,单向链表会转化为红黑树。当链表长度小于8,红黑树就会退化为单项链表。

        基本功能:

         在hashmap基础上提供了并发安全的实现,通过对于node节点去加锁,来保证数据更新的安全性。性能方面优化:

        jdk1.8、ConcurrentHashMap 的锁粒度是数组中某一个节点,

        jdk1.7 、锁定的是segment 锁的范围要更大,性能上会更低,

        引入红黑树,降低数据查询的时间复杂度

        当数组长度不够的时候,对数组进行扩容, 引入了多线程并发扩容(多个线程对原始数组进行分片),每个线程负责对一个分片的迁移。

   4、死锁发生的原因 怎么避免

        死锁:多个锁去竞争同一个资源 造成相互等待,如果没有外部干预、将无法往下执行

导致死锁的条件:

  1. 互斥条件 共享资源x和y 只能被一个线程占用
  2. 请求和保持条件 A线程已经取得共享资源x 在等待共享资源y的时候,不释放x
  3. 其他线程不能强行抢占线程A 占有的资源
  4. 循环等待:线程A 等待B占有的资源 B等待A占有的资源

解决死锁:

        通过人工干预来解决, 重启服务、或者kill 掉线程

        破坏其中任意一种 (互斥条件没办法破话) 互斥条件是互斥锁的基本约束

        5、CAS机制

        CAS是java中unsafe类里面的一个方法,全称:Compare and Swap比较并交换

        主要功能: 保证在多线程环境下,对于共享变量修改的一个原子性

        例子: 有一个成员变量state默认值为0 ,定义了一个方法,逻辑为,先判断state是否为0,如果为0 就修改为1,在单线程没有任何问题,多线程下会存在原子性问题。 这是是一个 read -write 操作, 一般解决会在方法 加 synchronized同步锁来解决,但是加锁 会带来性能上的损耗, 所以可以采用CAS机制进行优化。

   6、wait 和 notify 为什么要放在 synchronized

        wait 和notify 为了实现多个线程之间的协调, 阻塞/被唤醒 。他俩必然成对出现,

        要实现多线程之间的通信,除了管道流,只能通过共享变量的方法来实现,A线程修改共享变量s ,线程B 获得修改之后共享变量s的值

        但是多线程本身具有并行执行的特征,同一时刻多个线程可以同步执行,线程B 在访问共享变量之前,必须要知道线程A已经修改过共享变量S, 修改完同时唤醒等待状态下的线程, synchronized可以实现互斥条件,实现条件等待条件唤醒,为了避免wait /notify 错误使用,强制放入同步代码块。

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

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

相关文章

【UE5.3】笔记4-自定义材质蓝图

正常来说,我们都是拿到什么材质用什么材质,那么我们如何去创建自定义的材质呢? 首先,创建MyMaterials文件夹用来存放我们自制的材质; 然后,右键创建一个材质,起个名字,双击打开&am…

Linux-笔记 全志平台休眠功能初探

前言 全志平台支持的休眠功能主要包括两种模式:休眠模式和待机模式。这两种模式用于降低设备的功耗,并在需要时快速恢复工作状态。由于平台为T113,所以可以很方便的使用RTC来做唤醒源。唤醒源指的是能够让系统从休眠状态恢复到工作状态的信号…

必看-OpenStack面试攻略:揭秘企业最爱问的几个问题

问题:什么是OpenStack? 答案:OpenStack是一系列开源软件组成的云供给软件,用于构建和管理云计算平台。它允许企业或组织在自己的硬件上建立和管理云基础设施,并提供类似于公有云的弹性可扩展资源。 问题:O…

【Linux】Linux基础开发工具(yum)

Linux 软件包管理器 yum 什么是软件包 在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序.但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包(可以理解成windows上的安 装程序)放在一个服务器上, 通过包管理器可以很方便…

破坏人工智能

破坏人工智能 我一直在努力表达这个想法,也许问题是,一旦你把它放在那里,它实际上是很简单的,一旦你把想法写在纸上,真的没有很好的理由去解开整个案例。 我正在远离衡量和修复不公平的算法系统,或使它们…

不同材质的不锈钢氮气柜优缺点和使用场景分析

不锈钢氮气柜是一种用于存储对湿度敏感的物品的专用储藏设备,通过充入干燥的氮气来降低柜内湿度,保护存储物免受氧化或腐蚀。 根据不同的材质,不锈钢氮气柜可分为: 一、201不锈钢氮气柜: 201不锈钢因其较低的镍含量而成…

【第14章】探索新技术:如何自学SD3模型(找官方资料/精读/下载/安装/3款工作流/效果测试)ComfyUI基础入门教程

近期,也就是2024年6月12日,StabilityAI开源了最新的SD3模型的2B版本,而神奇的是,ComfyUI早在6月11号就已经适配了SD3!相比之下,SD WebUI 的更新速度却远远落后... 所以,如果想要尝试一些AI绘画领域的新技术,ComfyUI是一个非常值得投入时间学习的工具。 这节课,我们就…

防火墙虚拟系统

防火墙虚拟系统 防火墙虚拟系统的应用场景 大中型企业的网络隔离 通过防火墙的虚拟系统将网络隔离为研发部门、财经部门和行政部门。各部门之间可以根据权限互相访问,不同部门的管理员权限区分明确。 云计算中心的安全网关 通过配置虚拟系统,可让部署…

Sequelize的拓展

前言 基于上一篇Sequelize的基本操作后的一些补充扩展 一.分页查询 在查看详情的接口中进行整改 router.get(/, async function (req, res, next) {try {const query req.queryconst currentPage Math.abs(Number(query.currentPage)) || 1const pageSize Math.abs(Numb…

[XYCTF新生赛2024]-PWN:ptmalloc2 it‘s myheap plus解析(glibc2.35,堆中的栈迁移,orw)

查看保护 查看ida 思路: 泄露libc和堆地址就不多说了,fastbin duf也不解释了。这里主要是利用fastbin duf在environ附近创建堆块,泄露environ中的栈地址,然后就利用fastbin duf修改rbp和返回地址进行栈迁移了,迁移目标…

优化Docker部署:解决Java应用ExcelGenerateException并提速镜像构建

在开发和部署应用时,经常会遇到在本地环境运行正常,但迁移到Docker容器后出现特定错误的情况。本篇博客将聚焦于解决一个具体问题:当使用Docker部署包含Excel生成功能的Java应用程序时,遇到ExcelGenerateException的排查与解决方法…

Android SurfaceFlinger——注册监听底层调用(八)

通过上一篇文章的分析,能够发现其实 registerCallback 在 HWC2On1Adapter(也是 hwc2_device_t)中做的事情仅仅只是把当前的方法指针和回调类型存储起来,同时让刚注册进来的监听消费掉还没有回调上去的消息。其实真正从硬件回调上来的地方其实是 HWC2On1Adapter::Callback 中…

Xcode安装Simulator失败问题解决方法

Xcode安装Simulator_Runtime失败,安装包离线安装保姆级教程 Xcode更新之后有时候会提示要安装模拟器运行时环境,但是用Xcode更新会因为网络原因,我觉得基本上就是因为苹果服务器的连接不稳定导致的,更可气的是不支持断点续…

数据结构与算法笔记:高级篇 - 概率统计:如何利用朴素贝叶斯算法过滤垃圾短信?

概述 上篇文章我们讲到,如何用位图、布隆过滤器,来过滤重复数据。本章,我们再讲一个跟过滤相关的问题,如果过滤垃圾短信? 垃圾短信和骚扰电话,我想每个人都收到过吧?买房、贷款、投资理财、开…

第十六章:基于开源大模型使用huggingface在deepspeed与accelerator下继承源码权重保存而实现resume与infer

文章目录 前言一、huggingface的_save_checkpoint函数不同阶段保存内容介绍1、_save_checkpoint函数2、save_model函数3、_save函数4、save_pretrained函数5、resume说明二、模型训练Resume相关内容重载1、Resume的一次性权重载入(deepspeed_load_checkpoint)2、Resume的optimi…

Git 冲突处理指南:恢复 Git Reset

⭐️我叫忆_恒心,一名喜欢书写博客的研究生👨‍🎓。 如果觉得本文能帮到您,麻烦点个赞👍呗! 近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧,喜欢的小伙伴给个三连支…

【Liunx-后端开发软件安装】Liunx安装FDFS并整合nginx

【Liunx-后端开发软件安装】Liunx安装nacos 文章中涉及的相关fdfs相关软件安装包请点击下载: https://download.csdn.net/download/weixin_49051190/89471122 一、简介 FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括…

黑马点评06短信登录-用户请求和会话管理过程

用户请求发送: 用户的浏览器向服务器发送请求(例如,访问网页或提交表单)。请求头包含之前存储在浏览器中的Cookie,其中包括会话ID(Session ID)。 服务器接收请求: 服务器接收到用户的…

杭州代理记账报税全程托管专业实力全面指南

杭州代理记税报税服务可以为企业提供全程托管财务管理解决方案,确保企业的财务工作专业、高效、合规。以下是杭州代理记税报税服务全面指南: https://www.9733.cn/news/detail/185.html 一、代理记账报税服务的内容 基础服务: 每日记&#xf…

震坤行旗下安丹达坚持研发创新 助力企业实现安全生产

震坤行旗下安丹达坚持研发创新 助力企业实现安全生产 前不久,在上海新国际博览中心隆重召开了第106届劳保会,震坤行旗下安丹达作为展商首次亮相劳保会(展位:E4馆4F-02)。中国劳动保护用品交易会是由1966年开始举办的全…