锁升级及线程池相关

锁升级

在JVM底层实现锁的过程中,有三类锁:偏斜锁、轻量级锁、重量级锁

  • 在Java6之前,synchronized的实现完全依靠重量级锁(系统内的互斥锁),从用户态转为内核态非常消耗资源。
  • 在Java6之后,提供了三种不同Monitor实现,偏斜锁、轻量级锁、重量级锁。

所谓的升级、降级,就是JVM优化synchronized运行的机制,当JVM检测到不同的竞争状况时,会自动切换到适合的锁实现,这种切换就是锁的升级、降级。

偏向锁

  •      只有单线程执行情况下,该线程在后续访问时,便会自动获取锁。
  •       当没有线程并发出现时,会默认使用偏向锁。JVM会利用CAS操作,在对象头上的Mark Word部分设置线程ID,表示这个对象偏向于当前线程。无竞争开销。

轻量级锁

轻量级锁不支持并发,遇到1并发转为重量级锁。

支持多个线程以串行的方式访问同一个加锁对象。每次执行完,都消耗了重复加锁与解锁的性能开销。

锁的状态保存在对象头中。在Hotstop虚拟集中,一个JAVA对象的存储结构,在内存中的存储布局分为3块区域:对象头(Header)、实例数据(Instance data)和对其填充(Padding)。

轻量级锁加锁的过程:

  1. 在代码进入同步块的时候,如果对象锁状态为无锁状态(01),即将进入的当前线程先创建lock_record的空间,存储当前对象的Mark Work的拷贝,命名为Displaced Mark Word。
  2. 拷贝成功后,对象Mark Word中的prt_to_lock_record指向线程中的lock  record,并将lock record 里的owner指针指向对象的 Mark Word。若执行成功,并将无状态(01)修改为有状态(00)。若执行失败,判断当前对象锁Mark Word是否已经指向当前线程。是,当前线程已拥这个对象的锁,否则多个线程竞争该锁,直接接升级为重量级锁,状态值也会变为10。当前线程尝试使用自旋来获取锁。(不断尝试机制)

 轻量级锁的解锁过程:

  1. 通过CAS指令,尝试把线程中复制的Displaced Mark Word对象替换当前的Mark Word。
  2. 若替换成功,整个同步过程就完成了。
  3. 如果替换失败,说明有其他线程尝试过获取该锁,该锁已升级为重量级锁,要在释放锁的同时,通知其他线程重新参与所得竞争。

重量级锁

 依赖于操作系统互斥锁所实现的锁。操作系统的互斥锁实现线程之间的切换,需从用户态转为内核态。切换成本非常高,状态之间的转换需要相对比较的时间。

线程池

线程池是用于管理和复用线程的一种技术,可以优化线程的执行效率。因为,频繁的创建和销毁线程,会带来额外的系统开销,而线程池可以通过创建并重用一组线程来执行任务,可以显著减少这种开销,提高程序的性能和响应能力。

 线程池的基本流程:

             应用程序提交线程任务给线程池,判断线程池是否有空闲线程去执行任务,若有,创建新线程就去执行,若没有,比较当前运行的线程数和核心线程数,若小于,线程池会创建一个新线程去执行线程任务,若大于,线程池会检查工作队列是否满,若没满,放入队列进行等待,线程池出现空闲线程,将从队列中按照先进先出规则取出线程任务并分配执行;若已满,判断线程数是否达到最大线程数,若没达到,线程池创建新线程(非核心线程)执行线程任务;若已达到,直接采用拒绝策略处理新线程任务。

    执行顺序:核心线程、工作队列、非核心线程、拒绝策略。

如何创建线程池?

  • 通过Executors工具类的静态方法,创建线程池

  •  创建ThreadPoolExecutor对象,按照业务需求,自定义线程池参数,创建线程池

线程池的核心配置参数有哪些?

  •  corePoolSize:线程池的核心线程数

  • maximumPoolSize:线程池的最大线程数

  • KeepAliveTime:非核心线程存活时间

  • threadFactory:创建新线程的线程工厂

  • handler:线程池的决绝策略

线程池分类

  • FixedThreadPool:线程固定的线程池,使用Executors.newFixedThreadPool()创建;

  • CachedThreadPool:线程数根据任务动态调整的线程池,使用Executors.newCachedThreadPool创建

  • SingleThreadExecutor:进提供一个单线程的线程池,使用Executors.newSingleThreadExecutor()创建;

  • ScheduledThreadPool:能实现定时、周期性任务的线程池,使用Executors.newScheduledThreadPool()创建 

线程池的状态

  • 线程池的状态:RUNNING、SHUTDOWN、STOP、TIDYING、TERMINATED;
  • RUNNING运行状态:
    • 线程池一旦被创建,就处于RUNNING状态,并且线程池中的任务数为0.该状态的线程会接受新任务,并处理工作队列中的任务。
    • 调用线程池的shutdown()方法,可以切换到shutdown状态;
    • 调用线程池的shutdownNow()方法,可以切换到stop状态;
  • SHUTDOWN关闭状态:
    • ​​​​​​​该状态的线程池不会接受新任务,但会处理工作队列中的任务;
    • 当工作队列为空时,并且线程池中执行的任务也为空时,线程进入TIDYING状态;
  • STOP停止状态:
    • ​​​​​​​该状态的线程不会接受新任务,也不会处理阻塞队列中的任务,而且会中断正在运行的任务;
    • 线程池中执行的任务为空,进入TIDYING状态
  • TIDYING整理状态:
    • ​​​​​​​该状态表明所有的任务已经运行终止,记录的任务数量为0
  • TERMINATED终止状态:该状态表名线程彻底关闭。 

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

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

相关文章

vue3+less使用主题定制(多主题定制)可切换主题

假如要使用两套主题:蓝色、红色 例如: 首先确保自己的vue3项目有less,这边不多做接入解释 1、在src目录下建一个styles文件夹,在syles文件夹下面新建两个less文件:theme.less和variables.less; theme.le…

Java面试经典 150 题.P80. 删除有序数组中的重复项 II(004)

本题来自:力扣-面试经典 150 题 面试经典 150 题 - 学习计划 - 力扣(LeetCode)全球极客挚爱的技术成长平台https://leetcode.cn/studyplan/top-interview-150/ 题解: class Solution {public int removeDuplicates(int[] nums)…

【QNAP威联通NAS系统恢复进阶教程】如果 .conf 和 md9 无法自动组装,如何恢复 NAS?

创作立场:原创不易,拒绝搬运~ hello大家好,我是你们的老伙伴,稳重的大王~ 从本期开始,大王将在日常教程中,分享一些QNAP系统故障的排除以及解决办法,进阶教程需要具备一定的linux基础&#xf…

【JavaEE】【多线程】进阶知识

目录 一、常见的锁策略1.1 悲观锁 vs 乐观锁1.2 重量级锁 vs 轻量级锁1.3 挂起等待锁 vs 自旋锁1.4 普通互斥锁 vs 读写锁1.5 可重入锁 vs 不可重入锁1.6 不公平锁 vs 公平锁 二、synchronized特性2.1 synchronized的锁策略2.2 synchronized加锁过程2.3 其它优化措施 三、CAS3.…

玄机-应急响应- Linux入侵排查

一、web目录存在木马,请找到木马的密码提交 到web目录进行搜索 find ./ type f -name "*.php" | xargs grep "eval(" 发现有三个可疑文件 1.php看到密码 1 flag{1} 二、服务器疑似存在不死马,请找到不死马的密码提交 被md5加密的…

沈阳乐晟睿浩科技有限公司抖音小店运营创新

在当今这个数字化迅猛发展的时代,电子商务已经成为推动经济增长的重要引擎。而在电商的广阔舞台上,短视频与直播带货的崛起无疑是最为耀眼的明星之一。作为这一领域的佼佼者,抖音小店凭借其庞大的用户基础和独特的算法优势,吸引了…

使用Python和Parsel库爬取CSDN博客文章专栏并生成Markdown链接列表的导航

引言 今天,我将分享如何使用Python的requests和parsel库来爬取CSDN博客的文章,并生成一个Markdown格式的链接列表导航页。 我在整理这个专栏Linux基础操作合集的文章合集时,发现想要给这个专栏的文章做个导航合集页很麻烦,虽然直…

哪个牌子的宠物空气净化器好?口碑好的宠物空气净化器推荐!

哪个牌子的宠物空气净化器好?作为一名家电测评博主,我发现市面上宠物空气净化器的牌子越来越多了,很多厂家都看中了宠物行业的红利,想来分一杯羹,这就导致很多技术不成熟的产品流入了市场。今年我测试了50多台宠物空气…

数据清理——确保数据质量的关键步骤

简介 在数据分析和机器学习中,数据清理是预处理过程中的重要一环。良好的数据清理能够提高数据的质量,从而提升模型的准确性和可靠性。本篇文章将深入探讨数据清理的几个关键知识点,包括缺失值处理、数据不一致问题和噪声处理。通过详细的概…

isp框架代码理解

一、整体框架如下: 1 外层的src中 1.1 从camera.c->task.c:封装了3层,透传到某个功能的本级。 1.2 core.c和capability.c中实现:开机初始化加载参数。2. plat/src中 2.1 fun.c中继task.c又透传了一层;以及最后功能…

状态机模型

文章目录 一、大盗阿福二、股票买卖 IV三、股票买卖 V四、设计密码4.1kmp题目4.2设计密码 一、大盗阿福 题目链接 #include<iostream> #include<cstring> #include<algorithm> using namespace std; const int N 1e5 10; int f[N][2]; int main() {int…

MATLAB——矩阵操作

内容源于b站清风数学建模 数学建模清风老师《MATLAB教程新手入门篇》https://www.bilibili.com/video/BV1dN4y1Q7Kt/ 目录 1.MATLAB中的向量 1.1向量创建方法 1.2向量元素的引用 1.3向量元素修改和删除 2.MATLAB矩阵操作 2.1矩阵创建方法 2.2矩阵元素的引用 2.3矩阵…

一:Linux学习笔记(第一阶段)-- 安装软件 vmware workstation 虚拟机软件 centos系统

目录 学习计划&#xff1a; 资源准备 虚拟机软件&#xff1a;就别自己找了 现在换网站了 下载比较费劲 Centos8&#xff1a; 阿里云镜像地址下载&#xff08;下载比较版 但是有不同版本&#xff09;&#xff1a;centos安装包下载_开源镜像站-阿里云 百度网盘地址&#xff…

如何在Linux系统中使用Zabbix进行监控

如何在Linux系统中使用Zabbix进行监控 Zabbix简介 安装Zabbix 在Debian/Ubuntu系统中安装 在CentOS/RHEL系统中安装 配置Zabbix数据库 创建数据库 导入数据库 配置Zabbix服务器 访问Zabbix Web界面 完成初始配置 配置Zabbix Agent 安装Agent 配置Agent 添加主机到Zabbix 创…

uniapp编译多端项目App、小程序,input框键盘输入后

项目场景&#xff1a; uniapp编译后的小程序端&#xff0c;app端 在一个输入框 输入消息后&#xff0c;点击键盘上的操作按钮之后键盘不被收起&#xff0c;点击其他发送按钮时&#xff0c;键盘也不被收起。 问题描述 在编译后的app上普通的事件绑定&#xff0c;tap,click在发…

代码随想录day15 二叉树(3)

文章目录 day11 栈与队列(2)栈与队列的总结 day13 二叉树&#xff08;1&#xff09;day14 二叉树&#xff08;2&#xff09;day15 二叉树&#xff08;3&#xff09; day11 栈与队列(2) 逆波兰表达式求值 https://leetcode.cn/problems/evaluate-reverse-polish-notation/ 逆…

【C#】搭建环境之CSharp+OpenCV

在我们使用C#编程中&#xff0c;对图片处理时会用到OpenCV库&#xff0c;以及其他视觉厂商提供的封装库&#xff0c;这里因为OpenCV是开源库&#xff0c;所以在VS资源里可以直接安装使用&#xff0c;这里简单说明一下搭建的步骤及实现效果&#xff0c;留存。 1. 项目创建 1.1…

环形运输距离Conveyor Belts

Conveyor Belts 题面翻译 传送带 题目描述 传送带 $ m_n $ 是一个大小为 $ n \times n $ 的矩阵&#xff0c;其中 $ n $ 是一个偶数。矩阵由顺时针移动的同心带组成。 换句话说&#xff0c;当 n 2 n2 n2 时&#xff0c;传送带矩阵就是一个 2 2 2 \times 2 22 的矩阵&a…

ffmpeg视频滤镜:添加边框-drawbox

滤镜介绍 drawbox 官网链接 > FFmpeg Filters Documentation 这个滤镜会给视频添加一个边框。 滤镜使用 参数 x <string> ..FV.....T. set horizontal position of the left box edge (default "0")y <string&…

CPU算法分析LiteAIServer视频智能分析平台噪声检测功能在视频监控中的应用与优势

在视频监控系统中&#xff0c;噪声问题一直是影响视频画面清晰度和可用性的关键因素。这些噪声可能源于多种因素&#xff0c;如低光环境、摄像机传感器的高灵敏度或编码压缩过程中的失真等。为了应对这些挑战&#xff0c;CPU算法分析LiteAIServer引入了噪声检测功能&#xff0c…