【JavaEE 初阶(四)】多线程进阶
❣博主主页: 33的博客❣
▶️文章专栏分类:JavaEE◀️
🚚我的代码仓库: 33的代码仓库🚚
🫵🫵🫵关注我带你了解更多线程知识

目录
- 1.前言
- 2.常见的锁策略
- 2.1悲观锁vs乐观锁
- 2.2轻量级锁vs重量级锁
- 2.3自旋锁vs挂起锁
- 2.4读写锁
- 2.5可重入锁vs不可重入锁
- 2.6公平锁vs非公平锁
- 2.7synchronized
- 2.7.1锁升级
- 2.7.2锁消除
- 2.7.3锁粗化
- 3.CAS
- 4.Callable 接口
- 5.总结
1.前言
在前面的篇章中,我们已经学习了线程的一些基础知识但这并不只是全部,这只是一个开始,还需要同学们自己再进一步的学习,接下来我们学习多线程进阶的知识,这是在面试中,常考的题目,同学们一定要好好掌握。
2.常见的锁策略
2.1悲观锁vs乐观锁
悲观和乐观是对后续的锁冲突是否激烈做出的预测
悲观锁:如果预测下来的锁冲突概率很大,应该多做一些工作,称为悲观锁
乐观锁:如果预测下来的锁冲突概率不大,应该少做一些工作,称为乐观锁
2.2轻量级锁vs重量级锁
轻量级锁:锁的开销很小
重量级锁:锁的开销很大
2.3自旋锁vs挂起锁
自旋锁:一种轻量级锁的典型实现,往往是在纯用户态实现的
挂起锁:一种重量级锁的典型实现,要借助系统api实现,一旦出现锁竞争,就会在内核中触发一系列动作。
2.4读写锁
读加锁:读的时候能读但不能写
写加锁:写的时候不能读也不能写
2.5可重入锁vs不可重入锁
在一个线程中如果对一把锁连续加锁多次但不会出现死锁的情况就称为可重入锁,否则为不可重入锁。
2.6公平锁vs非公平锁
公平锁:根据线程添加锁的顺序来获取锁,先添加锁的线程先获得锁。
非公平锁:不管先后顺序,同时对锁进行均等概率竞争。
操作系统提供的加锁api默认情况下就是非公平锁,如何要实现公平锁,需要引入额外的队列来进行维护。
2.7synchronized
synchronized属于“悲观乐观”自适应的。
synchronized属于“重量轻量”自适应的。
synchronized属于“自旋挂起”自适应的。
synchronized属于“可重入”。
synchronized属于“非公平”。
synchronized不属于“读写锁”。
synchronized有3个重要机制:
2.7.1锁升级
锁升级的过程就是在性能和安全之前进行权衡

偏向锁:第一次尝试加锁的线程,优先进入偏向锁状态。偏向锁并不是真的加锁,而是给对象头中做一个偏向锁的标记,记录这个锁属于哪一个线程。在后续中,如果没有其他线程竞争锁就一直以这样的状态进行就可以避免加锁解锁的开销,如果有其他线程竞争此锁,因为之前已经在锁对象中记录了该锁属于哪一个线程,那么此时就立即对该线程进行加锁操作。
轻量级锁:随着其他线程进入竞争, 偏向锁状态被消除, 进入轻量级锁状态(自适应的自旋锁). 此处的轻量级锁就是通过 CAS 来实现.
重量级锁:如果竞争进一步激烈, 自旋不能快速获取到锁状态, 就会膨胀为重量级锁
2.7.2锁消除
编译器会自动针对当前写的代码进行优化,做出判断是否需要加锁,如果不需要会把所写的所优化掉。但只会在非常有把握的时候才会进行此操作.
2.7.3锁粗化
锁的粒度:synchronied里,代码越多就认为锁越粗,代码越少就认为锁越细。
粒度细,并发执行的逻辑更多,更利于利用cpu资源,但如果粒度细被反复加锁,编译器就会自动进行粗化。
3.CAS
CAS:Compare and swap,比较和交换的是内存和寄存器
CAS(M,A,B):比较A与M是否相等,如果相等就将B写入M,M=B,返回true,否则返回false。
CAS是一个cpu指令,被系统封装提供api,被JVM封装也提供api供我们使用。CAS是原子的,那么就可以使用CAS来替代加锁操作。
实现原子类
AtomicInteger atomicInteger=new AtomicInteger(0);//相当于i++;
atomicInteger.getAndIncrement();
在原子类里面是基于CAS来实现的,伪代码实现:

CAS进行操作的关键是通过判断value和oldvalue的值是否变化来作为是否有线程穿插执行的依据。但这种方式的判断是不够严谨的。
ABA问题:假设极端情况,如果一个线程把值从A改成B又改为A,针对对第一个线程看起来是没有改变的。大部分情况下ABA问题出现情况下,不会残生bug但是极端情况下就不好说了。
例如:我去ATM机取钱,我本身账户1000,我想要取出500,在取钱的出现了bug我按了一次没有反应,我就又按了一次,但第二次刚取了500,别人又汇入了500,此时第一次操作没有发现,就又取了500.实际上就扣了1000.

大部分情况下,ABA问题不是什么事,但极端情况会出现bug,只要让判定的数值按一定的方向增长就可以避免ABA问题。
4.Callable 接口
Callable 接口也是创建线程的一种方式。相当于把线性封装了一个返回值。
Callable<Integer> callable=new Callable<Integer>() {@Overridepublic Integer call() throws Exception {int sum=0;for (int i=0 ;i<=100;i++){sum+=i;}return sum;}};FutureTask<Integer> futureTask=new FutureTask<Integer>(callable);Thread t=new Thread(futureTask);t.start();System.out.println(futureTask.get());
5.总结
本篇文章只要介绍了常见的锁策略,悲观锁vs乐观锁,轻量级锁vs重量级锁,自旋锁vs挂起锁,读写锁,可重入锁vs不可重入锁,公平锁vs非公平锁,锁升级,锁消除,锁粗化,CAS,Callable 接口。
相关文章:
【JavaEE 初阶(四)】多线程进阶
❣博主主页: 33的博客❣ ▶️文章专栏分类:JavaEE◀️ 🚚我的代码仓库: 33的代码仓库🚚 🫵🫵🫵关注我带你了解更多线程知识 目录 1.前言2.常见的锁策略2.1悲观锁vs乐观锁2.2轻量级锁vs重量级锁2.3自旋锁vs挂起锁2.4读写…...
ZOC8 for Mac v8.08.1激活版:卓越性能的SSH客户端
在远程连接和管理的世界中,ZOC8 for Mac以其卓越的性能和丰富的功能,成为了众多专业人士的首选SSH客户端。它支持SSH1、SSH2、Telnet、Rlogin、Serial等多种协议,让您轻松连接到远程服务器。ZOC8拥有简洁直观的界面和强大的功能设置ÿ…...
指针(4)有点难
指针(4) 来做个简单的回顾: 指针数组: 1.是数组 2.是存放指针的数组 char* arr1[5]; int*arr2[3]; 数组指针: 1 .是指针 2 .指向数组的指针 字符指针:char*pc; 整型指针:int*pi; int …...
初步了解json文件
来自wetab 的AI pro: JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。JSON采用完全独立于语言的文本格式,但是它使用了类似于编程语言(特别是J…...
赶紧收藏!2024 年最常见 100道 Java 基础面试题(四十)
上一篇地址:赶紧收藏!2024 年最常见 100道 Java 基础面试题(三十九)-CSDN博客 七十九、forward和redirect的区别? 在Java Web应用程序中,forward和redirect是两种不同的服务器端重定向机制,它…...
初步了解Kubernetes
目录 1. K8S概述 1.1 K8S是什么 1.2 作用 1.3 由来 1.4 含义 1.5 相关网站 2. 为什么要用K8S 3. K8S解决的问题 4. K8S的特性 5. Kubernetes集群架构与组件 6. 核心组件 6.1 Master组件 6.1.1 Kube-apiserver 6.1.2 Kube-controller-manager 6.1.3 kube-schedul…...
前端工程化的基本介绍
文章目录 一、概念二、前端工程化的细节模块化组件化规范化 一、概念 工程化,可以理解为使用一些方式,去改良提高行业中现有的步骤、设计、应用方式。前端工程化,就是指对前端进行一些流程的标准化,让开发变得更有效率࿰…...
linux上Redis安装使用
环境centOS8 redis是缓存数据库,主要是用于在内存中存储数据,内存的读写很快,加快系统读写数据库的速度 一、Linux 安装 Redis 1. 下载Redis 官网下载Downloads - Redis 历史版本Index of /releases/ 本文中安装的版本为:h…...
prometheus+grafana的安装与部署及优点
一、Prometheus 的优点 1、非常少的外部依赖,安装使用超简单; 2、已经有非常多的系统集成 例如:docker HAProxy Nginx JMX等等; 3、服务自动化发现; 4、直接集成到代码; 5、设计思想是按照分布式、微服…...
JWK和JWT 学习
JWK和JWT 介绍 JWK (JSON Web Key) 和 JWT (JSON Web Token) 是现代Web应用程序中用于安全通信的两个重要概念。它们都是基于JSON的,并且是OAuth 2.0和OpenID Connect等协议的核心组成部分。 官方文档 JWT官方网站 JWK和JWK Set的RFC文档 JWT的RFC文档 JWK (JS…...
Go 使用mqtt
1、创建一个文件夹,并且使用go modules go mod init <module_name> 其中<module_name>是你的模块名称,如下 go mod init example.com/myproject 2、安装mqtt扩展 go get github.com/eclipse/paho.mqtt.golang 3、开始写主程序 package ma…...
C++ primer plus习题及解析第十二章(类和动态内存分配)
题目:12.1 题: 对于下面的类声明: class Cow { private:char name[20];char* hobby;double weight; public:Cow();Cow(const char* nm, const char* ho, double wt);//有参构造Cow(const Cow& c);//拷贝构造函数~Cow();//析构函数Cow&…...
gdb调试功能描述
gdb调试功能描述 gdb 调试:只对可执行文件进行调用,无法直接用gdb调试.c文件 1.查找命令帮助: (gdb) help data (gdb) help call -l (list) 查看载入文件(默认为10行)…...
使用Simulink Test进行单元测试
本文摘要:主要介绍如何利用Simulink Test工具箱,对模型进行单元测试。内容包括,如何创建Test Harness模型,如何自动生成excel格式的测试用例模板来创建测试用例,如何手动填写excel格式的测试用例模板来手动创建测试用例…...
深度学习中超参数设置
1、batchsize 在训练深度学习模型时,batch size(批大小)和 epochs(迭代次数)之间的关系取决于您的数据集大小、模型复杂度、计算资源等因素。下面是一些一般性的指导原则: 较大的 Batch Size:通…...
Docker nsenter 命令使用
查看容器对应宿主机上面的pid,容器技术的实质是进程,并没有完整的操作系统,就相当于在主机上面fork了一个子进程,通过docker daemon去fork一个子进程,这个子进程是可以在主机上面看到其pid的。 $ docker inspect -f {…...
十二种网络威胁防护方案
一、SQL注入 SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任…...
C++ sort()排序详解
头文件 在C中使用sort()函数需要使用#include<algorithm> sort()基本使用方法 sort()函数可以对给定区间所有元素进行排序。它有三个参数sort(begin, end, cmp) 其中begin为指向待sort()的数组的第一个元素的指针,end为指向待sort()的数组的最后一个元素的…...
移动机器人系统与技术:自动驾驶、移动机器人、旋翼无人机
这本书全面介绍了机器人车辆的技术。它介绍了道路上自动驾驶汽车所需的概念。此外,读者可以在六足机器人的构造、编程和控制方面获得宝贵的知识。 这本书还介绍了几种不同类型旋翼无人机的控制器和空气动力学。它包括各种旋翼推进飞行器在不同空气动力学环境下的模…...
zTasker v1.88.1一键定时自动化任务
软件介绍 zTasker是一款完全免费支持定时、热键或条件触发的方式执行多种自动化任务的小工具,支持win7-11。其支持超过100种任务类型,50种定时/条件执行方法,而且任务列表可以随意编辑、排列、移动、更改类型,支持任务执行日志&a…...
XCTF-web-easyupload
试了试php,php7,pht,phtml等,都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接,得到flag...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...
学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...
蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...
MinIO Docker 部署:仅开放一个端口
MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...
【若依】框架项目部署笔记
参考【SpringBoot】【Vue】项目部署_no main manifest attribute, in springboot-0.0.1-sn-CSDN博客 多一个redis安装 准备工作: 压缩包下载:http://download.redis.io/releases 1. 上传压缩包,并进入压缩包所在目录,解压到目标…...
python打卡第47天
昨天代码中注意力热图的部分顺移至今天 知识点回顾: 热力图 作业:对比不同卷积层热图可视化的结果 def visualize_attention_map(model, test_loader, device, class_names, num_samples3):"""可视化模型的注意力热力图,展示模…...
EasyRTC音视频实时通话功能在WebRTC与智能硬件整合中的应用与优势
一、WebRTC与智能硬件整合趋势 随着物联网和实时通信需求的爆发式增长,WebRTC作为开源实时通信技术,为浏览器与移动应用提供免插件的音视频通信能力,在智能硬件领域的融合应用已成必然趋势。智能硬件不再局限于单一功能,对实时…...
使用python进行图像处理—图像滤波(5)
图像滤波是图像处理中最基本和最重要的操作之一。它的目的是在空间域上修改图像的像素值,以达到平滑(去噪)、锐化、边缘检测等效果。滤波通常通过卷积操作实现。 5.1卷积(Convolution)原理 卷积是滤波的核心。它是一种数学运算,…...
