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

Java并发编程(3)


Java内存模型

1、说一下你对Java内存模型(JMM)的理解

   Java程序运行在各种硬件和操作系统上,不同硬件的CPU缓存策略、内存访问顺序、指令重排规则可能都不一样。那JMM是Java规范定义的一个抽象模型,是一套规则:

  • 线程和主内存的交互:线程如何从主内存读变量、写变量
  • 可见性保证:什么时候一个线程对变量的修改能被另一个线程看到
  • 有序性保证:哪些操作在多线程下不能随意重排,哪些可以。
//例如
volatile int flag = 0
//在x86CPU上可能会翻译成某种内存屏障指令
//在ARM CPU上可能是另一种
//但Java程序员只需知道:volatile保证可见性和禁止指令重排,效果是一样的

  JMM定义了线程和主内存之间的抽象关系:线程之间共享变量存储在主内存,每个线程有一个私有的本地内存。

  如果是双核CPU架构:

  • 每个核心:控制器+运算器+私有的一级缓存(L1缓存)
  • 共享缓存:有个架构有L2或L3,多个核心共享
  • 主内存:所有CPU都能访问

  JMM内存模型里定义了两个层次:

  • 主内存:所有线程共享,对应硬件上的主内存(DRAM)
  • 工作内存:每个线程独有,用来保存主内存中变量的副本
  • 流程:
    • 变量先从住内存加载到工作内存(寄存器/缓存)
    • 线程所有操作只在工作内存完成
    • 结果再写回主内存
    • 线程之间想看到对方的修改,必须通过主内存完成数据交换

 

2、说说你对原子性、可见性、有序性的理解

  •  原子性:一个操作不可再分,要么全部完成,要么全部不做
    • 在Java中,基本的读取和写入(如int x = 1)是原子的。但复合操作不是原子的(如i++)
    • 保证方式:synchronized或ReetrantLock(锁住临界区)、AtomicInteger、AtomicLong等原子类(通过CAS+volatile)
  • 可见性:一个线程对共享变量的修改,能被其他线程及时看到。(由于CPU缓存和寄存器存在,线程可能看到的是旧值)
    • 保证方式:volatile(保证写入立刻刷新到主内存);synchronized/Lock(解锁时强制刷新到主内存,加锁时清空工作内存,重新读)
  • 有序性:程序执行顺序和代码顺序一致,但编译器和CPU为了优化,可能会指令重排。(单线程不影响,多线程可能影响)
    • 保证方式:volatile禁止指令重排;synchronized/Lock进入临界区和退出时,JMM会插入内存屏障,保证临界区内操作的顺序性。JMM的happens-before原则,定义哪些操作必须对另一个操作可见,从而间接约束了顺序。

3、说说什么是指令重排

   指令重排 = 编译器或CPU在执行时,为了优化性能,会调整代码语句的执行顺序。(有序性)

  三种指令重排类型:

  • (1)编译器优化的重排
    • Java源代码-->字节码-->机器指令,中间编译器可能优化。只要不改变单线程的最终结果,就可以调整语句顺序。
  • (2)指令级并行(ILP)重排
    • CPU支持流水行并行,若指令间没有数据依赖,CPU会乱序执行以提高效率
  • (3)内存系统的重排
    • 因为有CPU cache,写缓冲区,导致内存的读写顺序看起来是乱的。
    • 假如线程A对变量x写入后,先放在写缓冲区,没立刻刷新到主内存。线程B去读时,可能还是旧值。
instance = new Singleton();

  三个底层步骤(理想顺序):

  • 分配内存:给Singleton对象分配一块内存控件,假设内存地址时0x1234。
  • 调用构造方法:在0x1234这块内存上,执行构造函数,把对象真正初始化好(比如成员变量赋值)
  • 把引用赋给变量instance:instance指向0x1234,之后通过instance就能找到这个对象。

  指令重排(为了优化性能,步骤2和3可能被交换)。若第三步变成第二步,此时对象还没初始化完。

  如果是多线程:A先执行new Singleton(),到第二步引用赋值给instance,此时线程A被切换走了。线程B看到if(instance == null),发现instance不是null,就直接返回instance,但其实这个uidx还没初始化完成。就可能会出现“半初始化对象”被使用的情况。

4、指令重排有限制吗?happens-before了解吗

   是有限制的,需要遵守两个主要约束:as-if-serial(后面讲)happens-before规则。

  happens-before规则是JMM提供的多线程间的有序性保证,定义了哪些操作对其他线程可见、必须按顺序。定义:如果操作A  happens-before 操作B,那A的结果必须对B可见,且A的执行顺序排在B之前。(注意,这是一种约束关系,不等于物理时间顺序。这只是用来保证逻辑先后关系,用来保证多线程下结果正确,同时允许底层做性能优化)

  六大原则:

  • 程序顺序规则:在一个线程内,按代码顺序,前面的操作happens-before 后面的操作
  • 监视器锁规则:对一个锁的解锁 happens-before 随后对这个锁的解锁。(如线程A释放锁->线程B获取同一把锁-->B必然能看到A的修改)
  • volatile变量规则:对一个volatile变量的写 happens-before 后续对这个变量的读。(如线程A flag = true-->线程B读取flag一定能看到true)
  • 传递性:若A happens-before B,B happens-before  C,那么A happens-before  C。
  • start规则:线程A调用threadB.start(),happens-before 线程B的任意操作。(如A在启动B之前的写操作,B一定都能看到)
  • join()规则:线程A调用threadB.join()并成功返回,意味着线程B的所有操作happens-before A从join返回(如B执行完写操作,A在join后一定能看到结果)

5、as-if-serial是什么?单线程的程序一定是顺序的吗?

   as-if-serial意思是:不管怎么重排,单线程程序的执行结果不能被改变。编译器和处理器不会对存在数据依赖关系的操作做重排,因为这会改变执行结果。但是,若操作之间不存在数据依赖关系,这些操作可能会被编译器和处理器重排。

double p i = 3.14 ; // A
double r = 1.0 ; // B
double area = p i * r * r ; // C
//C依赖A和B,A和B之间没有依赖
//顺序1:A-B-C
//顺序2:B-A-C
//C不可能在A、B前面

6、volatile实现原理

 (1)可见性

  相比synchronized的加锁方式来解决共享变量的内存可见性问题,volatile是更轻量的选择,没有上下文切换的额外开销成本。一个变量被声明为volatile时,线程再写入变量时不会把值缓存在寄存器或其他地方,而是会把值刷新回主内存,当其他线程读取该共享变量,会从主内存获取最新值,而不是使用当前线程的本地内存中的值。

image

 (2)有序性

  没有内存屏障可能会发生什么?

  • CPU可能把flag=true先执行并刷出,而a=1还在寄存器/缓存里没同步到主内存。
  • 指令乱序,导致“半初始化对象”
  • 读到旧值(缓存不一致),若没有屏障,写操作不会强制刷新到主内存

  volatile怎么保证有序性:JMM在volatile前后都会插入内存屏障,限制重排。

  • 写volatile前:保证之前写的变量先对外可见;保证bolatile写对后续读可见
  • 读volatile时:保证volatile读完后,才能读其他变量;保证volatile读完后,才能写其他变量。

  volatile修饰:实例变量、静态变量。不能修饰局部变量、方法和类(在线程栈中,本来就不共享)

线程安全:保证原子性、可见性、有序性

volatile只能保证后两者。

 

参考

[1] 沉默王二公众号

相关文章:

Java并发编程(3)

Java内存模型 1、说一下你对Java内存模型(JMM)的理解Java程序运行在各种硬件和操作系统上,不同硬件的CPU缓存策略、内存访问顺序、指令重排规则可能都不一样。那JMM是Java规范定义的一个抽象模型,是一套规则:线程和主内存的交互:线程如何从主内存读变量、写变量 可见性保…...

斐波那契子序列

到处乱逛找到的一道有意思的题。 定义斐波那契序列为:前两项值不做限制,\(f_i=f_{i-1}+f_{i-2}(2<i\le n)\)。 给定一个长度为 \(n\) 的序列 \(a\),找出其最长的斐波那契子序列。 如果有多个最长输出字典序最小的一个。 正解做法貌似为 \(n^2logn\)。即动态规划加二分。 …...

[豪の学习笔记] 软考中级备考 基础复习#10

UML建模概述、类图、用例图、顺序图、活动图、状态图、通信图、构件图跟学视频:学以致知Learning - 软件设计师 基础阶段|考点理论精讲 Chapter 10 - UML建模 1 - 概述 ​ 统一建模语言UML是面向对象软件的标准化建模语言。UML由三个要素构成:UML的基本构造块、支配这些构造块…...

题解:CF2137D Replace with Occurrences

题意为给定一个长度为 \(n\) 的序列 \(b\),要求你构造一个序列 \(a\) 使得对于每一个序列 \(a\) 中的数 \(a_i\),在序列 \(a\) 都出现了 \(b_i\) 次。 可以发现 \(a\) 序列中的数的大小是无关紧要的,重要的是出现次数。 一开始可以很快的得出一个错解那就是判断完有无解之后…...

题解:CF2137C Maximum Even Sum

题意是给定两个数 \(a,b\),你可以进行一次操作,选定一个 \(b\) 的因数 \(k\),将 \(a\) 变为 \(a \times k\),并将 \(b\) 变为 \(b/k\),求出如何操作可以使得 \(a+b\) 是一个偶数,并且值最大,请输出这个最大值。 如果不考虑 \(a+b\) 是否为偶数,容易想到最大值为 \(a\ti…...

第02周 java预习

课前问题列表 1.方法相关问题 public class Main {static void changeStr(String x) {x = "xyz";}static void changeArr(String[] strs) {for (int i = 0; i < strs.length; i++) {strs[i] = strs[i]+""+i;}}public static void main(String[] args) {…...

编码规范

1.不对指针变量进行sizeof操作。 2.数组作为函数参数时,必须同时将其长度作为函数的参数。 3.字符串或指针作为函数参数时,请检查参数是否为NULL. 4.对字符串进行存储操作,确保字符串有\0结束符。 5.整数之间运算时必须严格检查,确保不会出现溢出、符号反转或除以0。 6.内存…...

深入解析:【译】Visual Studio 八月更新已发布 —— 更智能的人工智能、更出色的调试功能以及更多控制权

深入解析:【译】Visual Studio 八月更新已发布 —— 更智能的人工智能、更出色的调试功能以及更多控制权pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &q…...

命令模式在 TPL Dataflow 反馈回路管道中的应用及问题解决

命令模式与 TPL Dataflow 基础概念 命令模式的核心在于对一类对象公共操作的抽象,通过定义统一的方法签名,将操作封装为独立对象。这种设计思路不仅实现了调用者与实现者的解耦,还为事件驱动架构和 AOP 思想提供了天然支持。在.NET 生态中,TPL Dataflow 组件为这种抽象提供…...

Ubuntu 24.04 服务器调整MySQL 8.0.42 三节点集群(一主两从架构)安装部署配置教程

Ubuntu 24.04 服务器调整MySQL 8.0.42 三节点集群(一主两从架构)安装部署配置教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", &q…...

使用almalinux基础镜像创建nginx镜像

前言 使用almalinux:latest镜像构建nginx镜像,启动容器时,nginx自动启动 创建基本文件 cd ~ mkdir nginxtest cd nginxtest/ echo nginx s running!!! >> index.html vi Dockerfile编辑dockerfile文件内容 FROM almalinux:latest MAINTAINER "smartaiops<smar…...

docke容器版Nessus登录+破解+激活+特征库更新

docke容器版Nessus登录+破解+激活+特征库更新 安装Nessus docker run -itd --name=ramisec_nessus -p 8834:8834 ramisec/nessus 重置账号密码1. 进入容器 docker exec -it ramisec_nessus bash2. 查看用户 /opt/nessus/sbin/nessuscli lsuser3. 修改指定用户的密码(以admin为…...

我把Cursor当磁盘清理工具用,非常棒! - ukyo-

我来帮您删除这个Colima虚拟磁盘镜像文件: [2 tools called] ✅ **文件删除成功!** **文件信息**:- **文件名**: basedisk- **位置**: ~/.colima/_lima/colima/- **大小**: 456MB- **类型**: Colima 虚拟磁盘镜像文件 **释放的磁盘空间**: **456MB** **删除后的影响**:- Co…...

vue项目

新建文件夹,然后用vscode打开这个文件然后在终端新建vue文件...

第九篇:数据库服务克隆应用

数据库克隆概念介绍 在数据库MySQL 8.0(8.0.17+)版本中,引入了数据库的克隆功能,主要是借助clone-plugin实现的,是对数据页底层克隆; 克隆的数据是InnoDB存储引擎中的物理快照信息,包括schemas, tables, tablespaces, and data dictionary metadata; 在数据库中出现克隆…...

Anti-Proxy Attendance 题解

CF1924F 题解题目传送门:CF1924F 还是第一次见这种势能题。 先把交互库的回答转成 \(0,1\) 表示答案是否在这个区间中。 首先把题目转化一下,对每个位置 \(i\) 维护一个 01 串 \(S_i\) 表示:如果 \(i\) 是答案,那么当前交互库的每个回答是否是真话。即如果当前询问 \([l,r]…...

【2024-2025第二学期】助教工作总结

一、助教工作的具体职责和任务 路由交换技术的助教的具体职责在于课前配合老师发布预习任务,在同学预习存在困难时给予问题解答;课中主要帮助同学解决实验遇到的卡壳问题,帮助同学们更快更全面的掌握实验内容和相应的理论知识;课后批改同学的作业、实验报告,并且对课中未完…...

开始每小时记录日程

每小时记录一次做的事,公开 20250914_155401 看b站视频,吃东西...

5【鸿蒙/OpenHarmony/NDK】使用Node-API进行异步任务开发

各位码友们好!今天这篇干货主要聚焦实操细节,希望能帮大家少踩坑。​ 要是过程中遇到哪块没看懂、有疑问,或者你有更优的实现思路,评论区尽管聊!发现文档里有疏漏或错误也尽管指出来 —— 技术这东西就得互相挑刺才能越磨越精,咱们一起把这些知识点吃透~是什么?与同步处…...

控制器指令

cpu中有控制器和运算器 这里就要开始学控制器 指令 指令分为两个部分: 操作码 做什么事情 地址码 对谁做 当cpu检测到操作码为000110的时候,就要执行停机操作 指令是计算机的最小功能单位 计算机智能执行自己指令系统中的指令,不能执行其他系统的指令 比如说inter芯片一般都…...

题解:AT_abc421_c [ABC421C] Alternated

题面 思路 似乎有很多大神用类似逆序对的方法 \(O(n\log n)\) 通过了此题,不过此题是有贪心 \(O(n)\) 做法的。 我们可以从结果推导,每一个 A 和 B 都相邻的情况只有两种:AB...AB 和 BA...BA,以下称这两个结果串为 \(t\),题目给出的串为 \(s\)。 考虑怎样使得其消耗代价最…...

MySQL数据库:SQL数据类型

SQL数据类型 数值类型 字符类型 时间日期类型...

Ubuntu 安装

太好了!系统已经安装完成了! 您现在看到的是安装成功的最终界面。这意味着所有步骤,包括分区、复制文件、安装更新和配置引导程序,都已全部顺利完成。您现在有两个选择:立即重启 (推荐)点击这个按钮,计算机将会重启。重启后,它会从硬盘启动,您将进入刚刚安装好的全新 U…...

幼等数论

整除 T1-1. Propose that \(m > n \geqslant 0\), Prove that \( (2{2n} + 1) \mid (2{2m} - 1) \) . Since we have:\[x^n - y^n = (x - y)(x^{n-1} + x^{n-2}y + \cdots + xy^{n-2} + y^{n-1})\] Therefore, we can rewrite:\[ 2{2m} - 1 = (2{2{n+1}}){2{m-n-1}} - 1{2{…...

搭建rocketmq的三主三从遇到的坑

1、机器配置cat /etc/hosts 192.168.224.128 worker1 192.168.224.129 worker2 192.168.224.130 worker3 2、broker配置 128机器 a-master#所属集群名字,名字⼀样的节点就在同⼀个集群内 brokerClusterName=rocketmq-cluster #broker名字,名字⼀样的节点就是⼀组主从节点。 …...

深入解析:轻松Linux-9.进程间通信

深入解析:轻松Linux-9.进程间通信pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; f…...

2025.9.14——1黄1绿

普及/提高- P2278 [HNOI2003] 操作系统 就是模拟,但是机房噪音太大调了好久…… 普及+/提高 P2233 [HNOI2002] 公交车路线 该说果然是老题吗……好简单的DP啊,应该只有黄的水平。...

Ubuntu 中改图片大小

在 Ubuntu 中,可以使用 ImageMagick 工具来调整图片的大小。ImageMagick 是一个强大的图像处理工具,支持多种图像格式和操作。 安装 ImageMagick 首先,您需要安装 ImageMagick。打开终端并输入以下命令: sudo apt-get install imagemagick使用 ImageMagick 缩放图片 安装完…...

认识眼图和眼图的参数

认识眼图 眼图(Eye Diagram)是用余辉方式累积叠加显示采集到的串行信号的比特位的结果,叠加后的图形形状看起来和眼睛很像,故名眼图。眼图的分析是数字系统信号完整性分析的关键之一。 眼图的形成 由于眼图是示波器用余辉方式将采集到的一系列串行信号的多个单位间隔(UI)…...

【芯片设计-信号完整性 SI 学习 1.2 -- loopback 回环测试】 - 实践

【芯片设计-信号完整性 SI 学习 1.2 -- loopback 回环测试】 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New…...

【科研绘图系列】R语言绘制地图和散点图 - 指南

【科研绘图系列】R语言绘制地图和散点图 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !…...

Java NIO 学习小记

Java NIO 学习小记 :Buffer、Channel 与 Selector 在 Java 的 I/O 体系中,NIO(New Input/Output)是对传统 BIO(Blocking I/O)的优化。NIO 提供了更高效的 面向缓冲区、基于通道 的数据处理方式,并且通过 多路复用器(Selector) 实现了单线程处理多个连接的能力。本文简…...

扩展欧几里得算法求乘法逆元

之前学过用快速幂求逆元,条件是当模数 \(p\) 为质数的时候,\(a\) 的逆元就是 \(a^{p - 2}\)。 但相较于扩展欧几里得算法求逆元,适用的范围是比较小的,因为扩展欧几里得算法适用于所有逆元存在的情况。在以下的式子中,模数为 \(m\) 的情况下,\(x\) 就是 \(a\) 的逆元 \[a…...

redis实现缓存3-封装redis工具类

具体实现: CacheClient package com.hmdp.utils;import cn.hutool.core.util.BooleanUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.data.re…...

高阻态

高阻态高阻态(High Impedance State,简称 Hi-Z 或 Hi-Z State)是指电路中的某个输出引脚或信号处于一种“关闭”状态,既不提供电流,也不吸收电流。这个状态通常用于三态逻辑(Tri-state Logic)系统中,目的是让该引脚既不会对电路中的其他部分产生影响,也不会消耗功率。…...

鸿蒙应用开发从入门到实战(四):ArkTS 语言概述

ArkTS是HarmonyOS优选的主力应用开发语言。ArkTS围绕应用开发在TypeScript(简称TS)生态基础上做了进一步扩展,继承了TS的所有特性,是TS的超集。​ 大家好,我是潘Sir,持续分享IT技术,帮你少走弯路。《鸿蒙应用开发从入门到项目实战》系列文章持续更新中,欢迎关注! 一…...

命令模式的深度解析:从标准实现到TPL Dataflow高性能架构

命令模式是对一类对象公共操作的抽象,它们具有相同的方法签名,所以具有类似的操作,可以被抽象出来,成为一个抽象的命令对象。实际操作的调用者就不是和一组对象打交道,它是需要以来这个命令对象的方法签名,并根据这个签名调用相关的方法。 以上是命令模式的大概含义,这里…...

ORA-01555系列:二、ORA-01555的场景分析与解决方案

我们的文章会在微信公众号IT民工的龙马人生和博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢! 由于博客中有大量代码,通过页面浏览效果更佳。本章将深入探讨ORA-01555的四种核心触发场景,为每种场景提供两个详细的…...

PySimpleGUI常用控件

PySimpleGUI常用控件序号 控件类型 控件函数1 文本控件 1-1:sg.Text() 或者 sg.T()1-2:sg.Input() 或 sg.In() 或 sg.InputText()(文本输入框)1-3:sg.Listbox()(多行列表文本框)1-4:sg.Multiline()(大文本框)2 按键控件 2-1:sg.Button() 或 sg.B()(按键)2-2:sg.E…...

202312_QQ_DNS流量

流量分析,DNS流量,pysharkTags:流量分析,DNS流量,pyshark 0x00. 题目 附件路径:https://pan.baidu.com/s/1GyH7kitkMYywGC9YJeQLJA?pwd=Zmxh#list/path=/CTF附件 附件名称:202312_QQ_packet1.zip 小张发现公司某台服务器被入侵,经过在服务器上抓包后得到流量文件,请帮忙分…...

读书笔记:为什么数据在磁盘上的存放顺序如此重要?

我们的文章会在微信公众号IT民工的龙马人生和博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢! 由于博客中有大量代码,通过页面浏览效果更佳。本文为个人学习《Expert Oracle Database Architecture Techniques and…...

Rcc_APBPeriphClockCmd()

Rcc_APBPeriphClockCmd()启用时钟后,外设能工作,而禁用时钟时外设无法工作的原因,主要是因为 时钟系统 是微控制器中控制所有硬件模块运行的基础。外设时钟负责为外设提供必要的运行时钟信号,没有时钟信号,外设就无法进行正常的操作。下面是一些具体的原因: 1. 时钟是外设…...

故障处理:ORA-19809: limit exceeded for recovery files

我们的文章会在微信公众号IT民工的龙马人生和博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢! 由于博客中有大量代码,通过页面浏览效果更佳。故障处理:ORA-19809: limit exceeded for recovery files 欢迎大家加入…...

25.09.14 与其感慨路难行,不如马上出发

从2025年9月14日起,我将在此博客网站记录本人对于后端开发路线的每日学习进度与感悟。未来有可能学习其他技术栈,同样将保持记录。 目前规划如下,每天做一道leetcode hot100,前期主要目标在于快速学习java技术栈:JavaWeb、Spring、SpringMVC、Mybatis、Redis、SpringBoot、…...

GCC工具链应用学习笔记

GCC工具链应用学习笔记pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; font-size: 1…...

初始化 MCP 环境 创建 MCP Server (一)

1、进入 python3 的 Miniconda 虚拟环境创建及进入方法,参见: https://www.cnblogs.com/rslai/p/18741276 2、安装 fastmcp 库pip install fastmcp安装成功后执行 pip list | grep fastmcp 可以查看已经安装 fastmcp 。如下图 3、创建 server 项目 A)新建一个目录,例如 m…...

博客园格式设置

一级标题 1 正文 zhengwen 正文 zhengwen 二级标题 1.1 正文 zhengwen 正文 zhengwen print("hello worldhello world"hello world"hello world"hello world"hello world"hello world"hello world"hello world"hello world&q…...

[总结/备赛]备战 CSP-S 2025 初赛总结

被拉到dl24jp集训一整天(我的作业啊啊啊啊啊) 1.排序算法 主要考察稳定性,时间复杂度,原理 1.1.插入排序最佳时间复杂度:\(O(n)\) 最差时间复杂度:\(O(n^2)\) 平均时间复杂度:\(O(n^2)\) 是否稳定:是 1.2.希尔排序(优化插入排序) 就是把元素分组,每组gap个,对gap中的元…...

win11 系统如何进行硬盘分区?固态硬盘怎么分区?SSD 固态硬盘是分区好还是不分区好?

win11 系统如何进行硬盘分区?固态硬盘怎么分区?SSD 固态硬盘是分区好还是不分区好?电脑硬盘分区教程 win11本身就有自带的分区功能,所以不用借肋第三方软件也能分区,下面开始分享分区方法。 win11其实和win10差不多,功能也差不多,如果分区过win10可能都不用学就会。 理解…...

逆序数及其应用

刷手机的时候看到一个逆序数的算法题,刚好又在复习矩阵论,行列式里也有用到逆序数,想到大二时学的逆序数计算算法,回顾了一下,并写下这篇文章记录。 1. 定义 假设有一个排列\(a_1,a_2,\dots,a_n\),如果下标对\(\langle i,j \rangle\)满足\(i \lt j\)而\(a_i > a_j\),…...