一零六六、线程池、锁

news2024/9/20 14:44:00

线程池:

管理线程创建,销毁的一系列池子

如何创建线程池?

ExecutorService executor = Executors.newFixedThreadPool(n);

创建线程有多种方法,为何要用线程池?

  • 减少性能开销,每次执行任务都新建线程
  • 造成cpu资源浪费使用线程池可以实现线程的复用
  • 通过自定义线程可以适应更多的业务场景,满足需求

线程池的流程?

常用JUC并发类?

  • CountDownLatch
  • CyclicBarrier
  • Semaphore
  • 前两者使用较多,不过注意区别,countDownLatch在等待时其他线程已经释放,可以进行其他工作,CyclicBarrier在等待其他线程时不会进行释放

线程池参数有哪些?

1.corePoolSize:线程池中的常驻核心线程数

2.maxinumPoolSize:线程池中能够容纳同时执行的最大线程数

3.keepAliveTime:多余的空闲线程的存活时间

当前线程池数量超过corePoolSize时,当空闲时间达到keepAliveTime时,多余空闲线程会被销毁直到只剩下corePoolSize个线程为止

4.unit:keepAliveTime的单位

5.workQueue:任务队列,被提交但是尚未被执行的任务

6.threadFactory:表示生成线程池中工作线程的线程工厂,用于创建线程一般用默认的即可

7.handler:拒绝策略,表示当队列满了并且工作线程-大于等于线程池的数量最大线程数(maxinumPoolSize)时如何来拒绝请求执行的runnable的策略


锁:

上锁,对资源进行锁定,用来供某些程序读写,其他程序只能等待

悲观锁:在可能会发生并发冲突的情况下,避免一切外来因素对数据造成不完整性的操作

乐观锁:在可能不会发生并发冲突的情况下,在提交之前进行检查

区别:悲观锁不管怎么样,先锁住再说,锁住再读写,多用于写的场景    乐观锁先读写再锁住,多用于读的场景

自旋锁:就是重试,比如你在获取锁的时候已经被其他线程占用了,然后你就等等再尝试

公平锁:这就更好理解了,排队买奶茶,都是老实人,排队就好

非公平锁:插队,但这个插队不是一定会比其他人快,他比起其他人的优势只是少了线程切换之间的开销(也就是一个人买完另一个人才下单这个切换的过程),没抢到还得去排队

可重入锁:允许线程在获取锁之后再次获取同一个锁,而不会被自己持有的锁所阻塞,也就是一个资源上加好几把锁

分布式锁:满足分布式场景,同一时刻只能有一个线程在操作

......

CAS是什么?

其实广泛点来说就是乐观锁,全称是Compare And Swap,一种原子性操作

先读取当前值,再计算预期值,相等就更新为新值,不相等就不管了

适用于具备较低并发竞争的情况,可以提高系统吞吐量和性能

synchronized锁?

其实是一个同步锁,也是一个Java中的关键字,可以加在方法前,那这个方法就是同步方法,在同一时间只能有一个线程访问,直到使用完释放锁之后,其他线程才能继续读写

总结:是一种线程同步机制,是实现线程安全的方法之一

Java中的锁和Mysql中锁的区别和联系?

  • 层次不同

        Java中的锁是应用层面的锁机制,通过Java语言提供的关键字(synchronized)或Lock接口实现
MySQL中的锁是数据库层面的锁机制,用于控制数据库操作的并发和数据隔离

  • 锁的粒度不同

        Java中的锁可以是对象级别的锁(synchronized关键字修饰的方法或代码块)或者线程级别的锁(Lock接口的实现类),用于保护共享资源或临界区
        MySQL中的锁可以是行表级别的锁或数据库级别的锁,用于控制对数据库对象的访问权限

  • 作用范围不同

        Java中的锁只在单个Java虚拟机(JVM)内起作用,仅用于线程之间的同步和互斥
MySQL中的锁是在数据库服务端进行控制的,可以跨多个客户端连接和线程,用于控制事务的隔离和并发操作

  • 锁的机制不同

        Java中的锁采用的是悲观锁机制,即假设并发冲突一定会发生,所以需要加锁来保证数据的一致性和可见性
        MySQL中的锁采用的是乐观锁机制和悲观锁机制相结合,通过行级锁、表级锁等方式实现对数据库对象的并发控制

        总结:Java中的锁主要用于线程同步和共享资源的互斥访问,而mysql中的锁主要用于数据库事务的隔离和并发操作的控制。它们的作用范围不同,机制不同,但都在不同的层面上提供了并发控制的手段


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

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

相关文章

【雕爷学编程】Arduino动手做(181)---Maixduino AI开发板11

37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的&am…

低代码平台的使用学习

背景 最近发现老婆每天都要捣鼓一个 excel 表格,并将表格发到群中,询问后才知道只是为了记录每天的事物变化。我想这接收方每次都要下载表格再打开看,太麻烦了,直接做个 web 表单,支持简单的增删改查就好了。 当我着…

Talk | ICCV‘23 华南理工大学林炜丰:视觉基础模型-尺度卷积调制遇上Transformer

本期为TechBeat人工智能社区第519期线上Talk! 北京时间8月3日(周四)20:00,华南理工大学—林炜丰的Talk已准时在TechBeat人工智能社区开播! 他与大家分享的主题是: “视觉基础模型-尺度卷积调制遇上Transformer”,他介绍了一种新的…

Godot 4 源码分析 - 碰撞

碰撞功能应该是一个核心功能,它能自动产生相应的数据,比如目标对象进入、离开本对象的检测区域。 基于属性设置,能碰撞的都具备这样的属性:Layer、Mask. 在Godot 4中,Collision属性中的Layer和Mask属性是用于定义碰撞…

在线文档协作工具有哪些推荐?

在现代工作和学习中,团队协作的重要性日益凸显。随着云计算和互联网技术的快速发展,越来越多的在线协作工具涌现出来,为我们提供了高效、便捷的协作方式。我根据日常工作经验,向大家推荐3款主流、且备受欢迎的在线协作工具&#x…

AI绘图实战(十二):让AI设计LOGO/图标/标识 | Stable Diffusion成为设计师生产力工具

S:AI能取代设计师么? I :至少在设计行业,目前AI扮演的主要角色还是超级工具,要顶替?除非甲方对设计效果无所畏惧~~ 预先学习: 安装及其问题解决参考:《Windows安装Stable Diffusion …

用C语言构建一个数字识别卷积神经网络

卷积神经网络的原理和对应的python例子参见: https://victorzhou.com/blog/intro-to-cnns-part-1/ 和...-2/ 这里仅叙述卷积神经网络的配置, 其余部分不做赘述,具体请参见上一篇: 用C语言构建一个手写数字识别神经网路 卷积网络同样采用简单的三层结构&#xff0c…

为何优秀的项目经理都在用鱼骨图?

什么是鱼骨图 鱼骨图,又被称为因果图或是石川图,是一种强大的视觉工具,用于识别,探索和显示在复杂过程中可能或已经出现的问题的所有可能原因。这个名字来源于这个图的形状,看起来像一条鱼的骨骼。 这种图表的起源可…

了解 CVSS:通用漏洞评分系统的应用

漏洞威胁管理至关重要,因为网络犯罪是一种持续存在的全球风险。网络犯罪分子愿意利用软件中的任何漏洞来访问网络和设备。对使用该软件的软件开发人员和组织的影响可能很严重。用户必须处理攻击的结果,例如赎金或数据盗窃,并且还可能面临法律…

笔记:Android 9系统启动流程

启动流程 1.按下电源,系统启动 当电源键按下时,引导芯片代码(汇编指令)会从预定的地方(固化在ROM)开始执行,将引导程序 BootLoader 加载到 RAM中,然后执行 2.引导程序 BootLoader …

箭头函数和普通函数的区别

1. 写法不同 const arrayFn (a, b) > a b; function add(a, b) > {return a b; }2. 内部this的指向不同 window.a 1;// 箭头函数中的this在定义时就已经固定,不会因为调用对象的不同而改变 const loga () > {const a 2;return this.a; }// this在该…

【C语言学习】逃逸字符(转义字符)

逃逸字符(转义字符) 1.\" 双引号 \" printf("请分别输入身高的英尺和英寸,""如输入\"5 7\"表示5英尺7英寸:");这里的"\就是双引号的作用,因为在双引号里面直接用双引号无意义&…

C++问题记录:VS中使用cout输出vsnprintf()产生的字符串有乱码

1. 问题介绍 使用Visual Studio开发一个C项目的时候,使用vsnprintf()生成格式化字符串,在使用std::cout输出该字符串的时候产生乱码,但是使用printf()输出的结果是正常的,下面是相关代码和结果,如有指教,欢…

量子力学的挑战和未来:未解决的问题和可能的发展方向

亲爱的读者, 欢迎回到我们的量子力学系列文章。在前面的几篇文章中,我们已经深入探讨了量子力学的起源、基本概念、实验验证以及应用领域,包括量子计算、量子通信和量子感应。今天,我们将探讨量子力学所面临的挑战以及未来可能的…

【雕爷学编程】 MicroPython动手做(34)——通用传感器的综合运用2

知识点:什么是掌控板? 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片,支持WiFi和蓝牙双模通信,可作为物联网节点,实现物联网应用。同时掌控板上集成了OLED…

@ControllerAdvice注解使用及原理探究 | 京东物流技术团队

最近在新项目的开发过程中,遇到了个问题,需要将一些异常的业务流程返回给前端,需要提供给前端不同的响应码,前端再在次基础上做提示语言的国际化适配。这些异常流程涉及业务层和控制层的各个地方,如果每个地方都写一些…

【云原生】Docker中容器管理常用所有命令

1.docker 容器创建流程 2.容器运行本质 docker run [OPTIONS] IMAGE [COMMAND] [ARG...] 创建容器基本选项:--name:为容器命名 -i:交互式创建容器 -d:后台创建容器 -t:为容器分配伪终端 Docker 容器存在的意义就是为…

Demystifying Prompts in Language Models via Perplexity Estimation

Demystifying Prompts in Language Models via Perplexity Estimation 原文链接 Gonen H, Iyer S, Blevins T, et al. Demystifying prompts in language models via perplexity estimation[J]. arXiv preprint arXiv:2212.04037, 2022. 简单来说就是作者通过在不同LLM和不同…

如何提升自信更好地面对挑战

简而言之:扬长避短,做自己。 动态 - CSDN AI话痨: 提升自信是面对挑战的关键之一。以下是一些方法可以帮助你提升自信,更好地面对挑战: 自我认知:了解自己的优点和缺点,认识到自己的强项和弱…

无涯教程-Perl - Subroutines(子例程)

定义子程序 Perl编程语言中 Subroutine子程序定义的一般形式如下: sub subroutine_name {body of the subroutine } 调用该Perl Subroutine的典型方式如下- subroutine_name( list of arguments ); 在Perl 5.0之前的版本中,调用 Subroutine的语法略有不同&…