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

【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◀️ &#x1f69a;我的代码仓库: 33的代码仓库&#x1f69a; &#x1faf5;&#x1faf5;&#x1faf5;关注我带你了解更多线程知识 目录 1.前言2.常见的锁策略2.1悲观锁vs乐观锁2.2轻量级锁vs重量级锁2.3自旋锁vs挂起锁2.4读写…...

ZOC8 for Mac v8.08.1激活版:卓越性能的SSH客户端

在远程连接和管理的世界中&#xff0c;ZOC8 for Mac以其卓越的性能和丰富的功能&#xff0c;成为了众多专业人士的首选SSH客户端。它支持SSH1、SSH2、Telnet、Rlogin、Serial等多种协议&#xff0c;让您轻松连接到远程服务器。ZOC8拥有简洁直观的界面和强大的功能设置&#xff…...

指针(4)有点难

指针&#xff08;4&#xff09; 来做个简单的回顾&#xff1a; 指针数组&#xff1a; 1.是数组 2.是存放指针的数组 char* arr1[5]; int*arr2[3]; 数组指针&#xff1a; 1 .是指针 2 .指向数组的指针 字符指针&#xff1a;char*pc; 整型指针&#xff1a;int*pi; int …...

初步了解json文件

来自wetab 的AI pro: JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;易于人阅读和编写&#xff0c;同时也易于机器解析和生成。JSON采用完全独立于语言的文本格式&#xff0c;但是它使用了类似于编程语言&#xff08;特别是J…...

赶紧收藏!2024 年最常见 100道 Java 基础面试题(四十)

上一篇地址&#xff1a;赶紧收藏&#xff01;2024 年最常见 100道 Java 基础面试题&#xff08;三十九&#xff09;-CSDN博客 七十九、forward和redirect的区别&#xff1f; 在Java Web应用程序中&#xff0c;forward和redirect是两种不同的服务器端重定向机制&#xff0c;它…...

初步了解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…...

前端工程化的基本介绍

文章目录 一、概念二、前端工程化的细节模块化组件化规范化 一、概念 工程化&#xff0c;可以理解为使用一些方式&#xff0c;去改良提高行业中现有的步骤、设计、应用方式。前端工程化&#xff0c;就是指对前端进行一些流程的标准化&#xff0c;让开发变得更有效率&#xff0…...

linux上Redis安装使用

环境centOS8 redis是缓存数据库&#xff0c;主要是用于在内存中存储数据&#xff0c;内存的读写很快&#xff0c;加快系统读写数据库的速度 一、Linux 安装 Redis 1. 下载Redis 官网下载Downloads - Redis 历史版本Index of /releases/ 本文中安装的版本为&#xff1a;h…...

prometheus+grafana的安装与部署及优点

一、Prometheus 的优点 1、非常少的外部依赖&#xff0c;安装使用超简单&#xff1b; 2、已经有非常多的系统集成 例如&#xff1a;docker HAProxy Nginx JMX等等&#xff1b; 3、服务自动化发现&#xff1b; 4、直接集成到代码&#xff1b; 5、设计思想是按照分布式、微服…...

JWK和JWT 学习

JWK和JWT 介绍 JWK (JSON Web Key) 和 JWT (JSON Web Token) 是现代Web应用程序中用于安全通信的两个重要概念。它们都是基于JSON的&#xff0c;并且是OAuth 2.0和OpenID Connect等协议的核心组成部分。 官方文档 JWT官方网站 JWK和JWK Set的RFC文档 JWT的RFC文档 JWK (JS…...

Go 使用mqtt

1、创建一个文件夹&#xff0c;并且使用go modules go mod init <module_name> 其中<module_name>是你的模块名称&#xff0c;如下 go mod init example.com/myproject 2、安装mqtt扩展 go get github.com/eclipse/paho.mqtt.golang 3、开始写主程序 package ma…...

C++ primer plus习题及解析第十二章(类和动态内存分配)

题目&#xff1a;12.1 题&#xff1a; 对于下面的类声明&#xff1a; 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 调试&#xff1a;只对可执行文件进行调用&#xff0c;无法直接用gdb调试.c文件 1.查找命令帮助&#xff1a; &#xff08;gdb&#xff09; help data &#xff08;gdb&#xff09; help call -l (list) 查看载入文件&#xff08;默认为10行&#xff09…...

使用Simulink Test进行单元测试

本文摘要&#xff1a;主要介绍如何利用Simulink Test工具箱&#xff0c;对模型进行单元测试。内容包括&#xff0c;如何创建Test Harness模型&#xff0c;如何自动生成excel格式的测试用例模板来创建测试用例&#xff0c;如何手动填写excel格式的测试用例模板来手动创建测试用例…...

深度学习中超参数设置

1、batchsize 在训练深度学习模型时&#xff0c;batch size&#xff08;批大小&#xff09;和 epochs&#xff08;迭代次数&#xff09;之间的关系取决于您的数据集大小、模型复杂度、计算资源等因素。下面是一些一般性的指导原则&#xff1a; 较大的 Batch Size&#xff1a;通…...

Docker nsenter 命令使用

查看容器对应宿主机上面的pid&#xff0c;容器技术的实质是进程&#xff0c;并没有完整的操作系统&#xff0c;就相当于在主机上面fork了一个子进程&#xff0c;通过docker daemon去fork一个子进程&#xff0c;这个子进程是可以在主机上面看到其pid的。 $ docker inspect -f {…...

十二种网络威胁防护方案

一、SQL注入 SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严&#xff0c;攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句&#xff0c;在管理员不知情的情况下实现非法操作&#xff0c;以此来实现欺骗数据库服务器执行非授权的任…...

C++ sort()排序详解

头文件 在C中使用sort()函数需要使用#include<algorithm> sort()基本使用方法 sort()函数可以对给定区间所有元素进行排序。它有三个参数sort(begin, end, cmp) 其中begin为指向待sort()的数组的第一个元素的指针&#xff0c;end为指向待sort()的数组的最后一个元素的…...

移动机器人系统与技术:自动驾驶、移动机器人、旋翼无人机

这本书全面介绍了机器人车辆的技术。它介绍了道路上自动驾驶汽车所需的概念。此外&#xff0c;读者可以在六足机器人的构造、编程和控制方面获得宝贵的知识。 这本书还介绍了几种不同类型旋翼无人机的控制器和空气动力学。它包括各种旋翼推进飞行器在不同空气动力学环境下的模…...

zTasker v1.88.1一键定时自动化任务

软件介绍 zTasker是一款完全免费支持定时、热键或条件触发的方式执行多种自动化任务的小工具&#xff0c;支持win7-11。其支持超过100种任务类型&#xff0c;50种定时/条件执行方法&#xff0c;而且任务列表可以随意编辑、排列、移动、更改类型&#xff0c;支持任务执行日志&a…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略

本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装&#xff1b;只需暴露 19530&#xff08;gRPC&#xff09;与 9091&#xff08;HTTP/WebUI&#xff09;两个端口&#xff0c;即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序

一、开发准备 ​​环境搭建​​&#xff1a; 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 ​​项目创建​​&#xff1a; File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

工程地质软件市场:发展现状、趋势与策略建议

一、引言 在工程建设领域&#xff0c;准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具&#xff0c;正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:

根据万维钢精英日课6的内容&#xff0c;使用AI&#xff08;2025&#xff09;可以参考以下方法&#xff1a; 四个洞见 模型已经比人聪明&#xff1a;以ChatGPT o3为代表的AI非常强大&#xff0c;能运用高级理论解释道理、引用最新学术论文&#xff0c;生成对顶尖科学家都有用的…...

算法岗面试经验分享-大模型篇

文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer &#xff08;1&#xff09;资源 论文&a…...

Go语言多线程问题

打印零与奇偶数&#xff08;leetcode 1116&#xff09; 方法1&#xff1a;使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...

代码规范和架构【立芯理论一】(2025.06.08)

1、代码规范的目标 代码简洁精炼、美观&#xff0c;可持续性好高效率高复用&#xff0c;可移植性好高内聚&#xff0c;低耦合没有冗余规范性&#xff0c;代码有规可循&#xff0c;可以看出自己当时的思考过程特殊排版&#xff0c;特殊语法&#xff0c;特殊指令&#xff0c;必须…...

day36-多路IO复用

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

深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏

一、引言 在深度学习中&#xff0c;我们训练出的神经网络往往非常庞大&#xff08;比如像 ResNet、YOLOv8、Vision Transformer&#xff09;&#xff0c;虽然精度很高&#xff0c;但“太重”了&#xff0c;运行起来很慢&#xff0c;占用内存大&#xff0c;不适合部署到手机、摄…...

协议转换利器,profinet转ethercat网关的两大派系,各有千秋

随着工业以太网的发展&#xff0c;其高效、便捷、协议开放、易于冗余等诸多优点&#xff0c;被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口&#xff0c;具有实时性、开放性&#xff0c;使用TCP/IP和IT标准&#xff0c;符合基于工业以太网的…...