多线程相关

JMM(内存模型)

JMM三个特性:

  • 原子性
    一个或者多个操作在CPU执行的过程中不被中断的特性,要么全部成功,要么全部失败
  • 可见性
    一个线程修改了共享变量的值后,其他线程能够立即看到这个修改
  • 有序性
    程序执行的顺序按照代码的先后顺序执行

synchronized与volatile、ReentrantLock的区别

  • synchronized与volatile
synchronizedvolatile
作用锁定当前对象,只有当前线程可以访问该对象,其他线程被阻塞。本质是在告诉 jvm 当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取;
使用范围变量、方法、和类变量
线程安全可以保证变量的可见性和原子性仅能实现变量的可见性,不能保证原子性
阻塞可能会造成线程的阻塞不会造成线程的阻塞
优化标记的变量可以被编译器优化标记的变量不会被编译器优化
  • synchronized与Lock
synchronizedLock
存在层面java 内置关键字,在 jvm 层面java 类(实际是一个接口),在API层面
锁的释放会自动释放锁: 线程执行完同步代码会释放锁 ; 线程执行中发生异常会释放锁需在 finally 中手工释放锁(unlock()方法释放锁)
锁的获取若线程 1 获得锁,线程 2 等待; 若线程 1 阻塞,线程 2 会一直等待分情况而定,Lock有多个获得锁的方式。 可尝试获得锁(tryLock()),线程可以不用一直等待
锁状态无法判断是否已经获取锁可判断是否已经获取到锁
锁类型可重入、不可中断、非公平 (只能等待锁释放,不能响应中断)可重入、可中断、可公平(两者皆可) (等待锁时可用interrupt来中断等待)
适用场景简单的线程同步控制。多线程竞争的概率很高。复杂的线程同步控制(比如:公平锁、读写锁)。多线程竞争的概率很低。
性能jdk1.6以前:重量级锁(无法取得锁即挂起,性能差) jdk1.6之后:优化了性能:给它的锁加入了四种状态,无锁状态 -> 偏向锁 -> 轻量级锁 -> 重量级锁,自动进行锁的升级。jdk1.6以后: Lock性能略好于synchronized
  • synchronized与ReentrantLock

相同点

说明
同步方式都是加锁方式同步
是否可重入都是可重入锁
是否阻塞都是阻塞式的同步

不同点
因为ReentrantLock实现了Lock,所以拥有synchronized与Lock的所有不同点,其他不同点如下:

synchronizedReentrantLock
锁条件个数1个可以多个

线程池

为什么使用线程池

在高并发的情况下,频繁的创建销毁线程,会影响系统性能。
使用线程池的好处:

  • 可以控制限制线程数量,避免系统负载过高
  • 可以避免频繁创建销毁线程带来的负担
  • 线程池中预先创建了线程,使用线程时直接分配,提高效率
  • 线程池统一管理线程参数和线程状态

缺点:
多线程会占CPU,使用多线程的地方并发量比较高时会导致其他功能响应很慢。

核心参数

  1. 核心线程数(Core Pool Size):线程池中保持存活的核心线程数量,即初始创建的线程数量。当任务数量超过核心线程数时,线程池会根据情况创建新的线程。

  2. 最大线程数(Maximum Pool Size):线程池中允许创建的最大线程数量。当任务数量超过核心线程数且工作队列已满时,线程池会继续创建新线程,直到达到最大线程数。

  3. 工作队列(Work Queue):用于存放等待执行的任务的队列。当任务数量超过核心线程数时,会先将任务存放在工作队列中,直到有空闲线程来执行。

  4. 线程存活时间(Keep Alive Time):当线程池中的线程数量超过核心线程数时,多余的空闲线程在经过一段时间后会被回收销毁,以减少资源占用。

  5. 拒绝策略(Rejected Execution Handler):当线程池无法接受新任务时的处理策略。常见的拒绝策略包括抛出异常、丢弃任务、丢弃最旧的任务和由调用线程执行等。

线程池的种类

ExecutorService是一个接口,而ThreadPoolExecutor是其具体实现之一,以下都是ThreadPoolExecutor的一种特定实现

类型说明示例
FixedThreadPool(固定大小线程池)固定大小线程池会创建固定数量的线程,当有任务提交时,如果线程池中有空闲线程,则立即执行;如果没有空闲线程,则将任务放入队列中等待执行。Executors.newFixedThreadPool
CachedThreadPool(缓存线程池)缓存线程池会根据需要动态创建线程,当有任务提交时,如果有空闲线程则复用;如果没有空闲线程,则创建新的线程。适用于任务执行时间较短的场景。Executors.newCachedThreadPool
SingleThreadPool(单线程池)单线程池只会创建一个工作线程来执行任务,保证任务按提交顺序依次执行。适用于需要顺序执行任务的场景Executors.newSingleThreadExecutor
ScheduledThreadPool(定时任务线程池)定时任务线程池可以定时执行任务或者周期性执行任务,可以设置延迟时间和间隔时间。Executors.newScheduledThreadPool
WorkStealingPool(工作窃取线程池)工作窃取线程池是Java 8新增的一种线程池,使用ForkJoinPool实现,可以根据任务的复杂性动态调整线程数量,提高并行任务的执行效率。
CachedThreadPool with SynchronousQueue(同步队列缓存线程池)这种线程池使用SynchronousQueue作为工作队列,适用于任务处理时间较短且任务量较大的场景。
SingleThreadScheduledExecutor(创建一个单线程的定时线程池)支持定时以及周期性执行任务的需求Executors.newSingleThreadScheduledExecutor

在这里插入图片描述

ExecutorService是一个接口,而ThreadPoolExecutor是其具体实现之一。选择使用哪个取决于具体需求和场景。以下是一些考虑因素:
ThreadPoolExecutor更灵活,提供更多参数设置,扩展性强,更易调优
FixedThreadPool,如果没有特殊需求,FixedThreadPool拿来即用

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

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

相关文章

武汉LUG报名开启!这次我们来到了华中科技大学,3月23日(周六)来见面吧!

内容来源:deepin 社区 LUG 不间断,精彩不停歇,经过一个月的修整,2024年3月23日下午,我们将在华中科技大学东校区举办 3月 WHLUG,欢迎大家来到现场,和我们一起交流技术,分享自己学习过…

惊艳到了,每个开发人员都必须要知道的6个HTML属性!

前端训练营:1v1私教,终身辅导计划,帮你拿到满意的 offer。 已帮助数百位同学拿到了中大厂 offer。欢迎来撩~~~~~~~~ Hello,大家好,我是 Sunday。 说起 HTML 很多同学都会认为,这不就是小菜一碟吗&#xff…

大型污水处理站运维公司怎么选择

大型污水处理站运维公司的选择是关乎环境保护和城市发展的重要决策。在如今污水治理领域日益重要的背景下,选择一家专业的运维公司对于确保污水处理站的高效运行、提高处理效果和保护环境具有关键意义。那么,我们应该如何选择适合自己的大型污水处理站运…

Css基础——精灵图(sprites)和字体图标

1、精灵图 1.1、精灵图的由来 一个网页中往往会应用很多小的背景图像作为修饰,当网页中的图像过多时,服务器就会频繁地接收和发送 请求图片,造成服务器请求压力过大,这将大大降低页面的加载速度。 因此,为了有效地减…

腾讯云服务器地域是什么?地域选择看着一篇就够了

腾讯云服务器地域怎么选择?不同地域之间有什么区别?腾讯云哪个地域好?地域选择遵循就近原则,访客距离地域越近网络延迟越低,速度越快。腾讯云百科txybk.com告诉大家关于地域的选择还有很多因素,地域节点选择…

Python (用户登录、身份归属地查询添加异常处理、绘制多角星、电影信息提取)

任务一:用户登录 登录系统通常分为普通用户与管理员权限,在用户登录系统时,可以根据自身权限进行选择登录。本任务要求实现一个用户登录的程序,该程序分为管理员用户与普通用户,其中管理员账号密码在程序中设定&#…

亚太大带宽服务器怎么设置

亚太大带宽服务器怎么设置,要设置亚太大带宽服务器,您需要考虑以下几个关键步骤,RAK部落小编为您整理发布亚太大带宽服务器怎么设置的具体步骤。 1. 选择合适的服务提供商:您需要选择一个提供亚太地区大带宽服务器的服务提供商。2…

靶向性叶酸-壳聚糖 FA-Chitosan 靶向纳米药物递送材料

产品简称:Chitosan-FA/ FA-Chitosan/CS-FA /FA-CS/Chitosan-Folate/ Folate-Chitosan/CS-Folate /Folate-CS 产品中文名称:壳聚糖-叶酸 / 叶酸-壳聚糖 分子量:可以根据要求定制 保存条件: -20干燥保存 有效期: 一年…

西门子PLC常用底层逻辑块分享_单/双输出电机

文章目录 前言一、功能概述二、单输出电机程序编写1.创建自定义数据类型2.创建FB功能块“单输出电机”3.编写程序 三、双输出电机程序编写1.创建自定义数据类型2.创建FB功能块“双输出电机”3.编写程序 前言 本文分享一个自己编写的电机控制逻辑块。 一、功能概述 手动状态、…

python 爬取人民新闻

基础信息获取: 要闻url:https://www.gov.cn/yaowen/liebiao/home.htm 下一页的url:https://www.gov.cn/yaowen/liebiao/home_1.htm 基础代码: import re import openpyxl import requests from lxml import etree import osdef …

Element-Plus: Select组件实现滚动分页加载

Element-Plus的select组件并没有自带滚动分页加载的功能,其虽然提供了自定义下拉菜单的底部的方式可以自定义上一页及下一页操作按钮的方式进行分页加载切换: 但如果不想通过点击分页按钮的方式,利用滚动触底进行下一页加载的话,…

力扣101---对称二叉树(简单题)

题目描述: 给你一个二叉树的根节点 root , 检查它是否轴对称。 示例 1: 输入:root [1,2,2,3,4,4,3] 输出:true示例 2: 输入:root [1,2,2,null,3,null,3] 输出:false 非递归Java代…