【JavaEE 初阶(四)】多线程进阶

news2024/10/6 18:28:42

❣博主主页: 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 接口。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JS控制台代码:淘宝PC网页付款页面定时确认付款

淘宝定时抢东西用的 必须先输入完正确密码&#xff0c;考虑上了网络延迟&#xff0c;程序提前一秒钟点击确认&#xff0c;可自行修改&#xff1a; function checkTime() {var now new Date();var hours now.getHours();var minutes now.getMinutes();var seconds now.getS…

线程池核心原理浅析

前言 由于系统资源是有限的&#xff0c;为了降低资源消耗&#xff0c;提高系统的性能和稳定性&#xff0c;引入了线程池对线程进行统一的管理和监控&#xff0c;本文将详细讲解线程池的使用、原理。 为什么使用线程池 池化思想 线程池主要用到了池化思想&#xff0c;池化思想…

vivado 低级别 SVF JTAG 命令

低级别 SVF JTAG 命令 注释 &#xff1a; 在 Versal ™ 器件上不支持 SVF 。 低级别 JTAG 命令允许您扫描多个 FPGA JTAG 链。针对链操作所生成的 SVF 命令使用这些低级别命令来访问链中的 FPGA 。 报头数据寄存器 (HDR) 和报头指令寄存器 (HIR) 语法 HDR length […

健康知识集锦

页面 页面代码 <% layout(/layouts/default.html, {title: 健康知识管理, libs: [dataGrid]}){ %> <div class"main-content"><div class"box box-main"><div class"box-header"><div class"box-title"&g…

CDGA|电子行业数据治理六大痛点及突围之道

CDGA|电子行业数据治理六大痛点及突围之道 随着信息技术的迅猛发展&#xff0c;电子行业对数据的需求和依赖日益增强。然而&#xff0c;数据治理作为确保数据质量、安全性及有效利用的关键环节&#xff0c;在电子行业中却面临着一系列痛点。本文将深入探讨电子行业数据治理的六…

基于LMV358的负电源架构

嘿UU们&#xff0c;中午好啊&#xff01;吃了没&#xff1f;算算时间我的餐桌上应该快上杨梅和鱼胶冻了。 今天看某群&#xff0c;突然想到Jim williams的书里一个架构&#xff0c;但老爷子的东西是正负输出的&#xff0c;而且略微有点麻烦&#xff0c;我就想怎么样整个更适合…

实现网站HTTPS访问:全面指南

在当今网络安全至关重要的时代&#xff0c;HTTPS已经成为网站安全的基本标准。HTTPS&#xff08;超文本传输安全协议&#xff09;通过在HTTP协议基础上加入SSL/TLS加密层&#xff0c;确保了数据在用户浏览器和服务器之间的传输是加密的&#xff0c;有效防止数据被窃取或篡改&am…

专题六_模拟(2)

目录 6. Z 字形变换 解析 题解 38. 外观数列 解析 题解 6. Z 字形变换 6. Z 字形变换 - 力扣&#xff08;LeetCode&#xff09; 解析 题解 class Solution { public:string convert(string s, int numRows) {// 42.专题六_模拟_N 字形变换_C// 处理边界情况if (numRows …

多线程典型例子(4)——线程池

文章目录 一、线程池的基本情况1.1、使用线程池的必要性1.2、线程池为什么比直接在系统中创建线程更高效&#xff1f;1.2.1、纯内核态操作1.2.2、纯用户态操作 1.3、那为什么用户态操作比内核态操作更高效&#xff1f;二、如何在Java中使用线程池2.1、ExecutorService2.1、Thre…

常见JavaWeb混合Vue.js课设中的要点

在校期间我们要做很多课设&#xff0c;实际上&#xff0c;学校教的大概率不足以让多数学生独立做出系统。在网上随便一搜&#xff0c;大抵都是千篇一律的“XXXX”管理系统。这些项目出于方便&#xff0c;往往采用vue作为前端框架而不用原生的JavaScript。 vue的本质要点是避免原…

FPGA HDMI Sensor无线航模摄像头

FPGA方案&#xff0c;接收摄像头sensor 图像数据后&#xff0c;通过HDMI输出到后端 客户应用&#xff1a;无线航模摄像头 主要特性&#xff1a; 1.支持2K以下任意分辨率格式 2.支持多种型号sensor 3.支持自适应摄像头配置&#xff0c;并补齐输出时序 4.可定制功能&#xff…

一文详解|影响成长的关键思考(二)

之前写过一篇《一文详解&#xff5c;影响成长的关键思考》&#xff0c;里面对自己工作前几年的心法进行了总结&#xff0c;并分享了出来。现在又工作了一段时间后&#xff0c;有了一些新的体会&#xff0c;想进一步分析一下&#xff0c;于是便有了此文。的确&#xff0c;思考也…

2024服贸会,参展企业媒体宣传报道攻略

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 2024年中国国际服务贸易交易会&#xff08;简称“服贸会”&#xff09;是一个重要的国际贸易平台&#xff0c;对于参展企业来说&#xff0c;有效的媒体宣传报道对于提升品牌知名度、扩大…

docker学习笔记(五):harbor仓库搭建与简单应用

harbor私有仓库 简介 Docker容器应用的开发和运行离不开可靠的镜像管理&#xff0c;虽然Docker官方也提供了公共的镜像仓库&#xff0c;但是从安全和效率等方面考虑&#xff0c;部署私有环境内的Registry也是非常必要的。Harbor是由VMware公司开源的企业级的Docker Registry管…

【快捷部署】022_ZooKeeper(3.5.8)

&#x1f4e3;【快捷部署系列】022期信息 编号选型版本操作系统部署形式部署模式复检时间022ZooKeeper3.5.8Ubuntu 20.04tar包单机2024-05-07 一、快捷部署 #!/bin/bash ################################################################################# # 作者&#xff…

晶片的厚度会影响晶振的频率吗?

晶振&#xff0c;是一种能够产生稳定频率的电子元件&#xff0c;广泛应用于各种电子设备中。晶振的频率参数&#xff0c;即其振荡产生的频率大小&#xff0c;是晶振性能的重要指标之一。石英晶体的切割方式显得至关重要。不同的切割方式&#xff0c;如AT-cut、CT-cut、SC-cut等…

实力再获认可!WeTrade荣获“最佳交易流动性”大奖

WeTrade在泰国举行的颁奖典礼上荣获“最佳交易流动性”奖项。 颁奖典礼于2024年4月28日在曼谷 Grande Centre Point Surawong 隆重举行&#xff0c;与FastBull 2024交易影响力颁奖典礼同期举办。FastBull是一家全球领先的金融资讯平台&#xff0c;覆盖全球多市场金融服务&…

推荐4个可用的github国内镜像

Github是全球最大的代码托管云平台&#xff0c;超过1亿用户在平台上分享代码及数据&#xff0c;深受生物信息学软件开发者的喜爱&#xff0c;并且现在发表文章&#xff0c;若涉及到代码&#xff0c;编辑还要求我们把代码及数据存放在github上&#xff0c;以便检查数据的真实性和…

风电齿轮箱轴承为风电齿轮箱核心部件 滑动轴承为其主要类型

风电齿轮箱轴承为风电齿轮箱核心部件 滑动轴承为其主要类型 风电齿轮箱轴承全称为风力发电机组齿轮箱轴承&#xff0c;为风电齿轮箱核心部件&#xff0c;起到减少摩擦损失、支撑齿轮等作用。风电齿轮箱轴承具备耐腐蚀、可靠性高、体积小、使用寿命长等优势&#xff0c;在大型风…

SparkStructuredStreaming状态编程

spark官网关于spark有状态编程介绍比较少&#xff0c;本文是一篇个人理解关于spark状态编程。 官网关于状态编程代码例子: spark/examples/src/main/scala/org/apache/spark/examples/sql/streaming/StructuredComplexSessionization.scala at v3.5.0 apache/spark (github…