【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>() {
            @Override
            public 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 接口。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LLM-AI大模型介绍

大语言模型 (LLM) 背景 &#x1f379;大语言模型 (Large Language Model) 是一种人工智能模型, 它们通常包含数千亿甚至更多的参数&#xff0c;并在大规模数据集上进行训练。大语言模型可以处理多种自然语言任务&#xff0c;如文本分类、问答、翻译、对话等等。 自然语言模型…

axios异步操作第一篇

1 同步请求和异步请求 客户端给java后台程序发送请求&#xff0c;发送请求的方式有两种&#xff1a; 同步请求 同步请求发送方式&#xff1a; 1 浏览器地址栏&#xff0c;输入url&#xff1a;http://localhost:8080/web-app/xxxServlet 2 3 删除 4 javascript:location.hr…

记录Postgresql 报错 the database system is in recovery mode

在开发环境中&#xff0c;突然有一天来到公司启动项目的时候报错 看到这个报错肯定是数据库出啥问题了&#xff0c;我们的数据库是部署在docker里面的。 远程服务器之后&#xff0c;使用命令查看容器&#xff0c;发现数据库容器还是启动着的 docker ps 那就进去容器内部看看…

搭建一个气膜篮球馆需要多少钱—轻空间

想要搭建一个气膜篮球馆&#xff0c;预算是个大问题。我们来谈谈具体的费用吧。 1. 建筑材料成本&#xff1a; 气膜篮球馆的建筑材料主要包括膜材、钢索等。膜材分为内膜和外膜&#xff0c;而钢索则用于支撑膜材。材料的品质和规格将直接影响到建筑的质量和使用寿命。 2. 设备…

winpcap无法安装提示新版本已经安装-window11解决办法

winpcap无法安装提示新版本已经安装-window11解决办法 问题解决办法 问题 安装ensp的时候跳出来这个问题&#xff0c;说自己的winpcap没安装&#xff0c;建议安装 但当自己去安装一个winpcap的时候&#xff0c;它又跳出来这个&#xff01; WinPcap 4.1.3 Setup A newer versi…

面试笔记——JVM组成

基本介绍 JVM: Java Virtual Machine Java程序的运行环境&#xff08;java二进制字节码的运行环境&#xff09; 使用JVM的好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收机制 JVM的组成及运行流程&#xff1a; 程序计数器 程序计数器&a…

OpenHarmony 实战开发——编译4.0 bete2及master分支,添加参数--no-prebuilt-sdk跳过编译sdk

简介 用户应用程序泛指运行在设备的操作系统之上&#xff0c;为用户提供特定服务的程序&#xff0c;简称“应用”。一个应用所对应的软件包文件&#xff0c;称为“应用程序包”。 OpenHarmony 提供了应用程序包开发、安装、查询、更新、卸载的管理机制&#xff0c;方便开发者…

LeetCode 404.左叶子之和

LeetCode 404.左叶子之和 1、题目 题目链接&#xff1a;404. 左叶子之和 给定二叉树的根节点 root &#xff0c;返回所有左叶子之和。 示例 1&#xff1a; 输入: root [3,9,20,null,null,15,7] 输出: 24 解释: 在这个二叉树中&#xff0c;有两个左叶子&#xff0c;分别…

2024数维杯B题完整思路24页+配套代码1-4问+可视化结果图

后续参考论文也会进行一个更新 2024年数维杯数学建模B题主要关注生物质和煤共热解问题的研究 点击链接加入群聊【2024数维杯数学建模ABC题资料汇总】&#xff1a; 2024数维杯B题完整思路18页1-5问配套代码后续参考论文https://www.jdmm.cc/file/2710636 该段文字的第一个问题…

C++——string的使用

string的使用 1. STL2. string2.1 初始化和遍历2.2 容量相关2.3 串的修改2.4 其他接口 1. STL STL全称 standard template libaray——标准模板库&#xff0c;内部包含了很多数据结构和算法&#xff0c;数据结构包括栈&#xff0c;队列&#xff0c;树&#xff0c;链表等&#…

【高阶数据结构】图 -- 详解

一、图的基本概念 图 是由顶点集合及顶点间的关系组成的一种数据结构&#xff1a;G (V&#xff0c; E)。其中&#xff1a; 顶点集合 V {x | x属于某个数据对象集} 是有穷非空集合&#xff1b; E {(x,y) | x,y属于V} 或者 E {<x, y> | x,y属于V && Path(x, y…

【SpringBoot整合系列】SpringBoot整合RabbitMQ-基本使用

目录 SpringtBoot整合RabbitMQ1.依赖2.配置RabbitMQ的7种模式1.简单模式&#xff08;Hello World&#xff09;应用场景代码示例 2.工作队列模式&#xff08;Work queues&#xff09;应用场景代码示例手动 ack代码示例 3.订阅模式&#xff08;Publish/Subscribe&#xff09;应用…

超详细的胎教级Stable Diffusion使用教程(一)

这套课程分为五节课&#xff0c;会系统性的介绍sd的全部功能和实操案例&#xff0c;让你打下坚实牢靠的基础 一、为什么要学Stable Diffusion&#xff0c;它究竟有多强大&#xff1f; 二、三分钟教你装好Stable Diffusion 三、小白快速上手Stable Diffusion 四、Stable dif…

本安防爆手机在电力行业中的应用

在电力行业这一充满挑战与风险的领域中&#xff0c;安全始终是最为首要的考量。电力巡检、维修等作业往往涉及易燃、易爆环境&#xff0c;这就要求工作人员配备能够在极端条件下保障通讯和作业安全的专业设备。防爆手机应运而生&#xff0c;以其独特的设计和卓越的性能&#xf…

05、Kafka 操作命令

05、Kafka 操作命令 1、主题命令 &#xff08;1&#xff09;创建主题 kafka-topics.sh --create --bootstrap-server 192.168.135.132:9092,192.168.135.133:9092,192.168.135.134:9092 --topic test1 --partitions 4 --replication-factor 3–bootstrap-server&#xff1a;…

Istio 流量管理(请求路由、流量转移、请求重试、流量镜像、故障注入、熔断等)介绍及使用

一、Istio 流量管理 Istio是一个开源的服务网格&#xff0c;它为分布式微服务架构提供了网络层的抽象。它使得服务之间的通信变得更为可靠、安全&#xff0c;并且提供了细粒度的流量管理、监控和策略实施功能。Istio通过在服务之间插入一个透明的代理&#xff08;Envoy&#x…

防静电段码屏驱动VK2C23适用于水电气表以及工控仪表类产品

VK2C23是一个点阵式存储映射的LCD驱动器&#xff0c;可支持最大224点&#xff08;56SEGx4COM&#xff09;或者最大416点&#xff08;52SEGx8COM&#xff09;的LCD屏。单片机可通过I2C接口配置显示参数和读写显示数据&#xff0c;也可通过指令进入省电模式。其高抗干扰&#xff…

Django实验(远程访问+图片显示)

众所周知&#xff0c;Python除了不能生孩子什么都会。Python也是可以做web服务的。 Python做web有一个重点优势是&#xff1a;做一个快速的AI Demo。 第一步&#xff1a;安装一个版本5.0以上django 第二步&#xff1a;构建咱们的Django工程&#xff0c;我取名为BBQ django-adm…

static静态成员变量和静态方法

当有new创建一个对象的,里面属性和方法,通过构造函数,能定义多个不同的对象,在我们做面向对象开发的时候,给一个场景,人在一个班级的时候,你的老师可能是固定的。 当我们用构造方法去构造的时候&#xff0c;每次都去传递一个固定的实参去定义个老师。 这样好会显得代码非常的…

Linux网络编程:TCP并发服务器实现

目录 1、前言 2、多进程代码实现 2.1 创建新的进程 2.2 客户端接收响应函数 2.3 僵尸进程处理 2.4 完整代码 2.5 代码测试 3、多线程代码实现 3.1 创建新的线程 3.2 线程函数定义 3.3 完整代码 3.4 代码测试 4、总结 1、前言 前面实现了基本的TCP编程&#xf…