当前位置: 首页 > news >正文

备战秋招002(20230704)

文章目录

  • 前言
  • 一、今天学习了什么?
  • 二、关于问题的答案
    • 1.线程池
    • 2.synchronized关键字
    • 3、volatile
  • 总结


前言

提示:这里为每天自己的学习内容心情总结;

Learn By Doing,Now or Never,Writing is organized thinking.

好久没打卡了,我真的是个垃圾,我要认真学习。

加油加油啊


提示:以下是本篇文章正文内容

一、今天学习了什么?

最近学习的都是 JUC 相关的内容,主要是两大块,线程池和AQS。

  1. 线程池
  2. synchronized
  3. AQS
  4. ReentrantLock

二、关于问题的答案

1.线程池

为什么需要线程池呢?什么是线程池

线程池是为了解决频繁的创建和销毁线程所带来的性能损耗,当任务到达线程池后,可以立马被线程执行任务,并且线程是稀缺资源,不能频繁的创建,如果线程数大于CPU的核心数,会导致频繁的上下文切换,影响性能。

线程池是存储了一批已经创建好的线程,可以被重复使用,去执行任务。

线程池的参数?
corePoolSize、maxPoolSize、阻塞队列、超时时间、超时时间的单位、线程工厂、拒绝策略。

当任务达到线程后的执行流程?

  1. 首先判断线程池中的线程数和最大核心线程数的关系,如果当前线程数小于最大核心线程数,创建新的核心线程去执行任务;
  2. 如果线程池中的线程数和最大核心线程数相等,那么判断阻塞队列是否已满;
  3. 阻塞队列未满,将线程放入阻塞队列中等待,阻塞队列已满,判断线程池中的线程数和线程池最大线程数的关系;
  4. 如果小于最大线程数,创建一个非核心线程去执行任务,如果已经达到最大线程数,那么需要根据线程池中的拒绝策略去对线程任务进行相应的处理。
    线程池执行流程
    饱和策略?

有四种:

  1. 直接拒绝;
  2. 抛出异常后拒绝;
  3. 让当前线程去执行这个任务;
  4. 丢弃阻塞队列中等待最久的任务,将新的任务放入阻塞队列中等待。

2.synchronized关键字

请你介绍一下synchronized关键字?
synchronized关键字是悲观锁的思想,属于独占锁,是通过JVM实现的。
让同一时刻保证只有一个线程能够占用锁资源,其它想要获取共享资源的线程都会被阻塞住。
保证在代码块内,即使出现异常,也能正确释放锁资源。

synchronized的底层实现原理?

在 JDK 1.6 以前,synchronized关键字加锁方式被称之为重量级锁,但是经过了优化,引入了可偏向锁和轻量级锁,synchronized的性能提升了很多。

Java创建对象的工作是由JVM来实现的,对象的内存布局分为三部分,对象头、实例数据、对齐填充,对象头由两部分组成,mark word 和 class pointer。在 mark word 中记录对象的hashcode、age、state,而synchronized关键字的锁机制,对应的就是mark word 中锁标志位的四种状态变化。

首先介绍重量级锁,之所以称之为是重量级锁,是因为在操作系统的底层,被synchronized关键字修饰的对象都关联了一个Monitor管程,通过mark word 指向管程引用。同一个对象的管程是同一个。

不加 synchronized 就不会关联 monitor 对象。

管程是一种特殊的数据结构,可以确保只有一个活动线程能成为占用者,由三部分组成:owner、entryList、waitSet。

当线程占用锁资源,会成为管程的owner对象,并将线程指向该管程的 owner 引用。

并且在重量级锁,实现了自旋优化,想要获取锁资源的线程,在获取失败后,会自选通过CAS再尝试去获取锁资源。

JDK 6 之后自旋锁是自适应的,是由 JVM 自己实现的,不属于我们的控制范围。

  • 轻量级锁:

由于每次都需要关联操作系统的 monitor 对象,使用成本很高,所以在 JDK 1.6 之后进行了优化,引入了 轻量级锁。

轻量级锁适用于有多线程去访问共享资源,但是不会在同一时刻发生竞争,如果在同一时刻发生竞争,轻量级锁会升级为重量级锁。

JVM 会在每个方法执行时,创建栈帧,当代码执行到 synchronized 代码块时,会在栈帧中创建 lock record 对象,lock record 中有两个重要的属性,分别是内存地址和对象引用。

使用 CAS 尝试将 对象头的mark word 和 lock record 中的内存地址交换,并且将 lock record 的对象引用指向对象,这就是轻量级锁加锁的方式,使用 CAS 。

如果加锁失败,可能有两种情况:

  1. 出现了其他线程同时竞争共享资源,出现锁膨胀,锁升级为重量级锁;
  2. 出现了锁重入的情况,就会在栈帧中再次创建一个 lock record 对象,只不过这个 lock record 对象的内存地址为null,对象引用指向共享资源;
  • 可偏向锁:

由于轻量级锁,即使当前线程已经获取到了共享资源,发生重入时,仍需要使用 CAS ,比较浪费性能。

可偏向锁是在线程第一次获取到共享资源时,使用 CAS 将自己的线程 ID 设置到对象头中,之后当线程需要访问共享资源时,只需要比较对象头中的线程 ID 是否一致即可,提高性能。

默认是打开可偏向锁的,如果共享资源处于可偏向状态,此时有其它的线程竞争共享资源,可偏向锁会升级为轻量级锁。

3、volatile

说一下 volatile 关键字?

被 volatile 关键字修饰的变量,有两层含义,一个是可见性,一个是有序性。

底层是操作系统的内存屏障实现的,当线程对被 volatile 关键字修饰的变量进行写操作时,会添加写屏障,读操作时,会添加读屏障。

写屏障,保证对共享变量的写入操作,会立即同步到主存中,并且保证共享变量写操作前的代码不会重排序到写操作后。

读屏障,保证对共享变量的读操作,总是读取内存中最新的数值,保证读操作前的代码不会重排序到读操作之后。

可以通过 volatile + CAS 实现无锁并发,性能比较高,单独使用 volatile 关键字适用于读多写少的场景。

volatile 关键字能保证原子性吗?为什么不能保证原子性?

不保证;因为原子性的定义是指一个操作是不可中断的,但是被 volatile 修饰的变量的写操作和读操作之间是可以被中断的,意味着在读取或者修改 volatile 变量的过程中,可能会有其他线程对这个变量进行修改。

如果需要保证原子性,建议使用 synchronized 关键字,或者 JUC 提供的工具类。


总结

提示:这里对文章进行总结:

明天需要继续复习,学习 Redis 和 刷题,还要做科研,准备周四下午的组会。

相关文章:

备战秋招002(20230704)

文章目录 前言一、今天学习了什么?二、关于问题的答案1.线程池2.synchronized关键字3、volatile 总结 前言 提示:这里为每天自己的学习内容心情总结; Learn By Doing,Now or Never,Writing is organized thinking. …...

游泳买耳机买什么的比较好,列举几款实战性好的游泳耳机

对于运动用户来说,在运动时都会选择听一些节奏感比较强的音乐,让自己运动是更有活力。现在已经是三伏天中的前伏期间,不少人会选择在三伏天的日子里进行减肥瘦身,耳游泳已经成为很多人都首选运动,游泳是非常好的有氧运…...

【无线传感器】使用 MATLAB和 XBee连续监控温度传感器无线网络研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...

Java基础-多线程JUC-生产者和消费者

1. 生产者与消费者 实现线程轮流交替执行的结果; 实现线程休眠和唤醒均要使用到锁对象; 修改标注位(foodFlag); 代码实现: public class demo11 {public static void main(String[] args) {/*** 需求&#…...

day2 QT按钮与容器

目录 按钮 1、QPushButton 2、QToolButton 3、QRadioButton 4、QCheckBox 示例 容器 ​编辑 1. QGroupBox(分组框) 2. QScrollArea(滚动区域) 3. QToolBox(工具箱) 4. QTabWidget(选…...

JPA 批量插入较大数据 解决性能慢问题

JPA 批量插入较大数据 解决性能慢问题 使用jpa saveAll接口的话需要了解原理&#xff1a; TransactionalOverridepublic <S extends T> List<S> saveAll(Iterable<S> entities) {Assert.notNull(entities, "Entities must not be null!");List<…...

为啥离不了 linux

Linux与Windows都是十分常见的电脑操作系统&#xff0c;相信你对它们二者都有所了解&#xff01;在你的使用过程中&#xff0c;是否有什么事让你觉得在Linux上顺理成章&#xff0c;换到Windows上就令你费解&#xff1f;亦或者关于这二者你有任何想要分享的&#xff0c;都可以在…...

基于分形的置乱算法和基于混沌系统的置乱算法哪种更安全?

在信息安全领域中&#xff0c;置乱算法是一种重要的加密手段&#xff0c;它可以将明文进行混淆和打乱&#xff0c;从而实现保密性和安全性。常见的置乱算法包括基于分形的置乱算法和基于混沌系统的置乱算法。下面将从理论和实践两方面&#xff0c;对这两种置乱算法进行比较和分…...

pve使用cloud-image创建ubuntu模板

首先连接pve主机的终端 下载ubuntu22.04的cloud-image镜像 wget -P /opt https://mirrors.cloud.tencent.com/ubuntu-cloud-images/jammy/current/jammy-server-cloudimg-amd64.img创建虚拟机&#xff0c;id设为9000&#xff0c;使用VirtIO SCSI控制器 qm create 9000 -core…...

shiro入门

1、概述 Apache Shiro 是一个功能强大且易于使用的 Java 安全(权限)框架。借助 Shiro 您可以快速轻松地保护任何应用程序一一从最小的移动应用程序到最大的 Web 和企业应用程序。 作用&#xff1a;Shiro可以帮我们完成 &#xff1a;认证、授权、加密、会话管理、与 Web 集成、…...

开源 sysgrok — 用于分析、理解和优化系统的人工智能助手

作者&#xff1a;Sean Heelan 在这篇文章中&#xff0c;我将介绍 sysgrok&#xff0c;这是一个研究原型&#xff0c;我们正在研究大型语言模型 (LLM)&#xff08;例如 OpenAI 的 GPT 模型&#xff09;如何应用于性能优化、根本原因分析和系统工程领域的问题。 你可以在 GitHub …...

Gitlab保护分支与合并请求

目录 引言 1、成员角色指定 1、保护分支设置 2、合并请求 引言 熟悉了Git工作流之后&#xff0c;有几个重要的分支&#xff0c;如Master(改名为Main)、Develop、Release分支等&#xff0c;是禁止开发成员随意合并和提交的&#xff0c;在此分支上的提交和推送权限仅限项目负责…...

ad18学习笔记九:输出文件

一般来说提供给板卡厂的文件里要包括以下这些文件 1、装配图 2、bom文件 3、gerber文件 4、转孔文件 5、坐标文件 6、ipc网表 AD_PCB&#xff1a;Gerber等各类文件的输出 - 哔哩哔哩 原点|钻孔_硬件设计AD 生成 Gerber 文件 1、装配图 如何输出装配图&#xff1f; 【…...

PostgreSQL 内存配置 与 MemoryContext 的生命周期

PostgreSQL 内存配置与MemoryContext的生命周期 PG/GP 内存配置 数据库可用的内存 gp_vmem 整个 GP 数据库可用的内存 gp_vmem&#xff1a; >>> RAM 128 * GB >>> gp_vmem ((SWAP RAM) - (7.5*GB 0.05 * RAM)) / 1.7 >>> print(gp_vmem / G…...

vue3 组件间通信的方式(setup语法糖写法)

vue3 组件间通信的方式(setup语法糖写法) 1. Props方式 该方式用于父传子&#xff0c;父组件以数据绑定的形式声明要传递的数据&#xff0c;子组件通过defineProps()方法创建props对象&#xff0c;即可拿到父组件传来的数据。 // 父组件 <template><div><son…...

【Cache】Rsync远程同步

文章目录 一、rsync 概念二、rysnc 服务器部署1. 环境配置2. rysnc 同步源服务器2.1 安装 rsync2.2 建立 rsyncd.conf 配置文件2.3 创建数据文件&#xff08;账号密码&#xff09;2.4 启动服务2.5 数据配置 3. rysnc 客户端3.1 设置同步方法一方法二 3.2 免交互设置 4. rysnc 认…...

Gitlab升级报错一:rails_migration[gitlab-rails] (gitlab::database_migrations line 51)

Gitlab-ce从V14.0.12升级到V14.3.6或V14.10.5时报错&#xff1a;如下图&#xff1a; 解决办法&#xff1a; 先停掉gitlab: gitlab-ctl stop 单独启动数据库&#xff0c;如果不单独启动数据库&#xff0c;就会报以上错误 sudo gitlab-ctl start postgresql 解决办法&#x…...

chatGPT流式回复是怎么实现的

chatGPT流式回复是怎么实现的 先说结论&#xff1a; chatGPT的流式回复用的就是HTTP请求方案中的server-send-event流式接口&#xff0c;也就是服务端向客户端推流数据。 那eventStream流式接口怎么实现呢&#xff0c;下面就进入正题&#xff01; 文章目录 chatGPT流式回复…...

使用SpringEL获得字符串中的表达式运算结果

概述 有时候会遇上奇怪的需求&#xff0c;比如解析字符串中表达式的结果。 这个时候自己写解析肯定是比较麻烦的&#xff0c; 正好SprinngEL支持加()、减(-)、乘(*)、除(/)、求余&#xff08;%&#xff09;、幂&#xff08;^&#xff09;运算&#xff0c;可以免去造轮子的功夫…...

力扣 39. 组合总和

题目来源&#xff1a;https://leetcode.cn/problems/combination-sum/description/ C题解&#xff1a; 递归法。递归前对数组进行有序排序&#xff0c;可方便后续剪枝操作。 递归函数参数&#xff1a;定义两个全局变量&#xff0c;二维数组result存放结果集&#xff0c;数组pa…...

【Python】 -- 趣味代码 - 小恐龙游戏

文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

C++初阶-list的底层

目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频

使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...

聊一聊接口测试的意义有哪些?

目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开&#xff0c;首…...

图表类系列各种样式PPT模版分享

图标图表系列PPT模版&#xff0c;柱状图PPT模版&#xff0c;线状图PPT模版&#xff0c;折线图PPT模版&#xff0c;饼状图PPT模版&#xff0c;雷达图PPT模版&#xff0c;树状图PPT模版 图表类系列各种样式PPT模版分享&#xff1a;图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定&#xff0c;这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中&#xff0c;积分电荷法最为常用&#xff0c;其原理是通过测量在电容器上积累的热释电电荷&#xff0c;从而确定热释电系数…...

【Go语言基础【13】】函数、闭包、方法

文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数&#xff08;函数作为参数、返回值&#xff09; 三、匿名函数与闭包1. 匿名函数&#xff08;Lambda函…...

day36-多路IO复用

一、基本概念 &#xff08;服务器多客户端模型&#xff09; 定义&#xff1a;单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用&#xff1a;应用程序通常需要处理来自多条事件流中的事件&#xff0c;比如我现在用的电脑&#xff0c;需要同时处理键盘鼠标…...