一零六六、线程池、锁

线程池:

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

如何创建线程池?

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中的锁主要用于数据库事务的隔离和并发操作的控制。它们的作用范围不同,机制不同,但都在不同的层面上提供了并发控制的手段


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

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

相关文章

Shell脚本学习-MySQL单实例和多实例启动脚本

已知MySQL多实例启动命令为: mysqld_safe --defaults-file/data/3306/my.cnf & 停止命令为: mysqladmin -uroot -pchang123 -S /data/3306/mysql.sock shutdown 请完成mysql多实例的启动脚本的编写: 问题分析: 要想写出脚…

MINIO安装(centos7)

步骤1:安装wget 在开始安装MinIO之前,需要安装wget命令行工具。可以使用以下命令在CentOS系统中安装wget: sudo yum install wget 步骤2:下载MinIO wget https://dl.minio.org.cn/server/minio/release/linux-amd64/minio 将下…

分布式应用:ELK企业级日志分析系统

目录 一、理论 1.ELK 2.ELK场景 3.完整日志系统基本特征 4.ELK 的工作原理 5.ELK集群准备 6.Elasticsearch部署(在Node1、Node2节点上操作) 7.Logstash 部署(在 Apache 节点上操作) 8.Kiabana 部署(在 Node1 节点…

常用SQL语句总结

SQL语句 文章目录 SQL语句1 SQL语句简介2 DQL(数据查询语句)3 DML(数据操纵语句)4 DDL(数据定义语句)5 DCL(数据控制语句)6 TCL(事务控制语句) 1 SQL语句简介…

面试热题(最长回文子串)

给你一个字符串 s,找到 s 中最长的回文子串。 如果字符串的反序与原始字符串相同,则该字符串称为回文字符串 输入:s "babad" 输出:"bab" 最长回文子串以前的博客已经讲过KMP算法以及比较不常见的Manacher算法…

使用数字陷波器滤除工频信号

使用数字陷波器滤除工频信号 在实际测量时经常会受到工频信号(交流50Hz)的干扰,有时干扰还很大,有用信号完全被淹没了。可以应用数字陷波器来消除工频信号的干扰。 数字陷波器函数如下函数:iirnotch功能:数…

【JVM】(二)深入理解Java类加载机制与双亲委派模型

文章目录 前言一、类加载过程1.1 加载(Loading)1.2 验证(Verification)1.3 准备(Preparation)1.4 解析(Resolution)1.5 初始化(Initialization) 二、双亲委派…

【go-zero】docker镜像直接部署API与RPC服务 如何实现注册发现?docker network 实现 go-zero 注册发现

一、场景&问题 使用docker直接部署go-zero微服务会发现API无法找到RPC服务 1、API无法发现RPC服务 用docker直接部署 我们会发现API无法注册发现RPC服务 原因是我们缺少了docker的network网桥 2、系统内查看 RPC服务运行正常API服务启动,通过docker logs 查看日志还是未…

寄存器详解(一)

目录 前言: 通用寄存器 示例: 通用寄存器的划分 汇编指令 cpu物理地址的形成 地址加法器运算示例: 1. 相关部件提供段地址和偏移地址 2. 段地址和偏移地址送入地址加法器 3. 段地址*16 4. 求出物理地址 5. 输出物理地址 段的概念 Deb…

在线五子棋对战

目录 数据管理模块(数据库设计) 前端界面模块 业务处理模块 会话管理模块网络通信模块(session,cookie) 在线管理模块 房间管理模块 用户匹配模块 项目扩展 数据管理模块(数据库设计) 数据库中有可能存在很多张表&#xf…

MQTT(EMQX) - SpringBoot 整合MQTT 连接池 Demo - 附源代码 + 在线客服聊天架构图

MQTT 概述 MQTT (Message Queue Telemetry Transport) 是一个轻量级传输协议,它被设计用于轻量级的发布/订阅式消息传输,MQTT协议针对低带宽网络,低计算能力的设备,做了特殊的优化。是一种简单、稳定、开放、轻量级易于实现的消息…

APP开发中的性能优化:提升用户满意度的关键

APP开发中的性能优化是需要持续进行的,它不仅能够让用户体验到 APP的使用感受,还能在一定程度上提升用户的满意度,从而提升 APP的粘性和转化率。不过在实际开发中,很多 APP开发公司会存在性能优化上的问题,这就需要了解…

[C++项目] Boost文档 站内搜索引擎(3): 建立文档及其关键字的正排 倒排索引、jieba库的安装与使用...

之前的两篇文章: 第一篇文章介绍了本项目的背景, 获取了Boost库文档 🫦[C项目] Boost文档 站内搜索引擎(1): 项目背景介绍、相关技术栈、相关概念介绍…第二篇文章 分析实现了parser模块. 此模块的作用是 对所有文档html文件, 进行清理并汇总 🫦[C项目] …

【力扣每日一题】2023.8.4 不同路径3

目录 题目: 示例: 分析: 代码: 题目: 示例: 分析: 在二维网格之上,让我们模拟从开头走到末尾,并且要经过所有能经过的点,问我们有多少种走法。 看到这道…

c++学习(异常)[28]

c语言处理错误机制 c异常概念 try {//保护的标识代码 }catch(ExceptionName e1) {//catch块 }catch(ExceptionName e2) {//catch块 }catch(ExceptionName eN) {//catch块 }匹配 优先调用链中最近的捕获 异常若不被捕获则报错终止程序 try { }catch ( ... ) //可以捕获任意类…

TCP的三次握手和四次挥手······详解

1、三次握手 三次握手是建立连接的过程 如图大致为三次握手的流程图: 当客户端对服务端发起连接时,会先发一个包连接请求数据,去询问能否建立连接,该数据包称为 “SYN”包 然后,如果对方同意连接,那么…

RabbitMQ:概念和安装,简单模式,工作,发布确认,交换机,死信队列,延迟队列,发布确认高级,其它知识,集群

1. 消息队列 1.0 课程介绍 1.1.MQ 的相关概念 1.1.1.什么是MQ MQ(message queue:消息队列),从字面意思上看,本质是个队列,FIFO 先入先出,只不过队列中存放的内容是message 而已,还是一种跨进程的通信机制…

2024年杭州电子科技大学MEM项目招生信息全面了解

2024年全国管理类硕士联考备考已经到了最火热的阶段,不少考生开始持续将注意力集中在备考的规划中!杭州达立易考教育整合浙江省内的MEM目信息,为大家详细梳理了相关报考参考内容,方便大家更好完成择校以及针对性的备考工作。本期为…

史上最全docker启动命令

docker Docker 启动镜像 一、查看当前docker中下载的镜像,如下图,当前我的Docker容器中存在两个镜像 ,tomcat、mysql 二、启动镜像 (因启动命令参数过多,同时各种镜像启动时可以增加额外的参数,本次以启动mysql5.6为例…

(12)理解委托,反射,Type,EvenInfo,插件, 组合枚举,BindingFlags,扩展方法及重载,XML认识

一、复习委托事件 1、委托复习。 private delegate int MyDelegate(int a, int b); //1.定义委托类型private static void Main(string[] args){MyDelegate md new MyDelegate(AddDelegate);//2.声明委托变量int result md(1, 2);//3.调用委托Console.WriteLine(result);Cons…