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

golang -- 认识channel底层结构

channel

channel是golang中用来实现多个goroutine通信的管道(goroutine之间的通信机制),底层是一个叫做hchan的结构体,定义在runtime包中

type hchan struct {qcount   uint           // 循环数组中的元素个数(通道中元素个数)dataqsiz uint           // 循环数组的长度buf      unsafe.Pointer // 数组指针elemsize uint16          能够收发的元素的大小synctest bool // true if created in a synctest bubbleclosed   uint32        channel是否关闭的标志timer    *timer // timer feeding this chanelemtype *_type // element typesendx    uint   // 下一次发送数据的下标位置recvx    uint   // 下一次接收数据的下标位置recvq    waitq  // 读等待队列sendq    waitq  // 写等待队列// lock protects all fields in hchan, as well as several// fields in sudogs blocked on this channel.//// Do not change another G's status while holding this lock// (in particular, do not ready a G), as this can deadlock// with stack shrinking.lock mutex      //互斥锁,保证读写channel时不存在并发竞争问题
}

hchan结构体的组成部分主要有四个:

  1. buf --> 保存goroutine之间传递数据的循环链表
  2. sendx和recvx --> 记录循环链表当前发送或接收数据的下标值
  3. sendq和recvq --> 保存向chan发送和从chan接受数据的goroutine的队列
  4. lock --> 保证channel写入和读取数据时线程安全的锁

🔗有关channel的基本学习

select

select定义在runtime包中

在Linux系统下,select 是一种IO多路复用的解决方案,IO多路复用就是用一个线程处理多个IO请求。
在Golang中,select 是 在一个goroutine协程监听多个channel(代表多个goroutine)的读写事件,提高从多个channel获取信息的效率

select的使用方法与switch相似,这是一个使用select 语句的例子

select {
case <- chan1://语句1
case chan2 <- 1://语句2
default://语句3
}

对上面这段代码的解释:

第一个case:如果成功接收到chan1中的数据,执行语句1
第二个case:如果成功发送数据到chan2,执行语句2
default:如果上面case都不满足,执行语句3

select底层是一个 在runtime包中定义的 scase结构体

type scase struct {c    *hchan         // case中使用的chanelem unsafe.Pointer // 指向case包含的数据的指针
}

在case语句中(除default),包含的是对channel的读写操作,所以scase结构体中包含这两个要素:使用的channel 和指向数据的指针

select的几个规则

  1. select中的多个case的表达式必须都是channel的读写操作,不能是其他的数据类型;
  2. 如果不满足任何case语句,同时没有default,那么当前的goroutine阻塞(没有case时,所在的goroutine永久阻塞,发生panic)
  3. Go自带死锁检测机制,当发现当前协程再也没有机会被唤醒时,则发生panic
  4. select中满足多个case,随机选择一个满足的case下的语句去执行
  5. select 中只有一个case时(不是default),实际会被编译器转换为对该channel的读写操作,和实际调用data:=<-ch 或 ch<-data 没有什么区别
    例如这样的一个代码
ch := make(chan struct{})
select {
case data <- ch:fmt.Printf("ch data: %v\n", data)
}

会被编译器转换为

data := <- ch
fmt.Printf("ch data: %v\n", data)
  1. select 中有一个case + 一个 default
package main
import ("fmt"
)
func main() {ch := make(chan int)select {case ch <- 1:fmt.Println("case")default:fmt.Println("default")}
}

编译器会转换为

if selectnbsend(ch, 1) {fmt.Println("case")
} else {fmt.Println("default")
}
func selectnbsend(c *hchan, elem unsafe.Pointer) (selected bool) {return chansend(c, elem, false, getcallerpc())
}

**runtime.selectnbsend()**函数调用runtime.chansend()函数,传入这个函数的第三个参数是false,该参数是 block,为false代表非阻塞,即每次尝试从channel读写值,如果不成功则直接返回,不会阻塞。

锁与死锁

数据竞争

多个goroutine同时对一个变量进行处理时,会造成数据竞争,某个goroutine执行的结果可能会覆盖掉其他goroutine中的操作,导致结果与预期不符
比如这样一个代码

var (x int64wg sync.WaitGroup // 等待组
)// add 对全局变量x执行5000次加1操作
func add() {for i := 0; i < 5000; i++ {x = x + 1}wg.Done()
}func main() {wg.Add(2)go add()go add()wg.Wait()fmt.Println(x)
}

预期的结果时输出10000,但是每次执行都会输出不同的结果

要想程序正确执行,可以给goroutine上锁(这个例子中是互斥锁),从而保证同一时间只有一个goroutine可以访问共享资源。

Go语言中的锁分为两种:互斥锁和读写锁

互斥锁

互斥锁只有一种锁,即sync.Mutex,是绝对锁,同一时刻一段代码只能被一个线程运行,使用方法Lock(加锁)和Unlock(解锁)即可实现

方法功能
func lock(l *mutex)获取互斥锁
func unlock(l *mutex)获取互斥锁

上面代码使用互斥锁

var (x int64wg sync.WaitGroup // 等待组m sync.Mutex // 互斥锁
)// add 对全局变量x执行5000次加1操作
func add() {for i := 0; i < 5000; i++ {m.Lock() // 修改x前加锁x = x + 1m.Unlock() // 改完解锁}wg.Done()
}func main() {wg.Add(2)go add()go add()wg.Wait()fmt.Println(x)
}

输出

10000

在Lock()和Unlock()之间的代码段称为资源的临界区(critical section),临界区的代码是要执行的代码

使用互斥锁能够保证同一时间有且只有一个 goroutine 进入临界区,其他的 goroutine 则在等待;当互斥锁释放后,等待的 goroutine 才可以获取锁进入临界区
多个 goroutine 同时等待一个锁时,唤醒的策略是随机的

读写锁

互斥锁保证了同一时间一段代码只能被一个线程运行,但是当不涉及资源的修改,只是获取资源时,使用互斥锁就没必要了,这种场景下读写锁是种更好的选择

读写锁有两种锁,即读锁和写锁。

读锁(RLock),不是绝对锁,允许多个读者同时读取;
写锁(Lock),是绝对锁,同一时刻一段代码只能被一个线程运行

当已经有读锁时,还可以任意加读锁,不可以加写锁(直到读锁全部释放)
当已经有写锁时,不可以再加读锁,也不可以再加写锁

读写锁的方法

方法功能
func (rw *RWMutex) RLock()获取读锁
func (rw *RWMutex) RUnlock()释放读锁
func (rw *RWMutex) Lock()获取写锁
func (rw *RWMutex) Unlock()释放写锁
func (rw *RWMutex) RLocker() Locker返回一个实现Locker接口的读写锁

读写锁的优点:
使用读写互斥锁在读多写少的场景下能够极大地提高程序的性能

注:对于锁而言,不应该将其作为值传递和存储,应该使用指针

死锁

当两个或两个以上的进程在执行过程中,因争夺资源而处理一种互相等待的状态,如果没有外部干涉无法继续下去,这时我们称系统处于死锁或产生了死锁

死锁主要有以下几种场景。

  1. Lock/Unlock不是成对出现时

没有成对出现容易会出现死锁的情况
例如下面只有Unlock 没有Lock 的情况

var m sync.Mutex        //锁
var wait sync.WaitGroup //等待组变量func hello() {fmt.Println("hello")
}
func main() {hello()m.Unlock()
}

报错
go fatal error: sync: unlock of unlocked mutex

使用defer ,使 lock 和unlock 紧凑出现可以增加容错

m.Lock()
defer m.Unlock()
  1. 锁被拷贝使用
func main(){m.Lock()defer m.Unlock()copyTest(m)
}func copyTest(m sync.Mutex) {  //值传递m.Lock()   //defer m.Unlock()fmt.Println("ok")
}

在函数外,加了一个Lock,在拷贝的时候又执行了一次Lock,这时候发生堵塞,而函数外层的Unlock也无法执行,所以永远获得不了这个锁,这时候就发生了死锁

  1. 交叉锁

下面这样一段代码

func main() {var mA, mB sync.Mutexvar wg sync.WaitGroupwg.Add(2)go func() {defer wg.Done()mA.Lock()defer mA.Unlock()mB.Lock()defer mB.Lock()}()go func() {defer wg.Done()mB.Lock()defer mB.Lock()mA.Lock()defer mA.Unlock()}()wg.Wait()
}

执行后
go fatal error: all goroutines are asleep - deadlock!

执行过程:
goroutine1获取mA
goroutine2获取mB
goroutine1尝试获取mB,但是已经被goroutine2获取,等待mB释放
goroutine2尝试获取mA,但是已经被goroutine1获取,等待mA释放
两者都在等对方释放锁,形成死锁

相关文章:

golang -- 认识channel底层结构

channel channel是golang中用来实现多个goroutine通信的管道&#xff08;goroutine之间的通信机制&#xff09;&#xff0c;底层是一个叫做hchan的结构体&#xff0c;定义在runtime包中 type hchan struct {qcount uint // 循环数组中的元素个数&#xff08;通道…...

使用PEFT库将原始模型与LoRA权重合并

使用PEFT库将原始模型与LoRA权重合并 步骤如下&#xff1a; 基础模型加载&#xff1a;需保持与LoRA训练时相同的模型配置merge_and_unload()&#xff1a;该方法会执行权重合并并移除LoRA层保存格式&#xff1a;合并后的模型保存为标准HuggingFace格式&#xff0c;可直接用于推…...

基于微信小程序的在线聊天功能实现:WebSocket通信实战

基于微信小程序的在线聊天功能实现&#xff1a;WebSocket通信实战 摘要 本文将详细介绍如何使用微信小程序结合WebSocket协议开发一个实时在线聊天功能。通过完整的代码示例和分步解析&#xff0c;涵盖界面布局、WebSocket连接管理、消息交互逻辑及服务端实现&#xff0c;适合…...

SaaS基于云计算、大数据的Java云HIS平台信息化系统源码

利用云计算、大数据等现代信息技术研发的医疗信息管理系统&#xff08;HIS&#xff09;实现了医院信息化从局域网向互联网转型&#xff0c;重新定义医疗卫生信息化建设的理念、构架、功能和运维体系。平台构建了以患者为中心的云架构、云服务、云运维的信息体系&#xff0c;实现…...

【Linux】动静态库的使用

&#x1f4dd;前言&#xff1a; 这篇文章我们来讲讲Linux——动静态库的使用 &#x1f3ac;个人简介&#xff1a;努力学习ing &#x1f4cb;个人专栏&#xff1a;Linux &#x1f380;CSDN主页 愚润求学 &#x1f304;其他专栏&#xff1a;C学习笔记&#xff0c;C语言入门基础&…...

10.2 LangChain v0.3全面解析:模块化架构+多代理系统如何实现效率飙升500%

LangChain 框架概述 关键词:LangChain 技术栈, 模块化架构, LCEL 表达式语言, LangGraph 多代理系统, LangServe 服务化部署 1. 框架定位与技术演进 LangChain 是当前大模型应用开发的事实标准框架,通过模块化设计实现 AI 工作流编排、工具链集成 和 复杂业务逻辑封装。其演…...

开源免费iOS或macOS安装虚拟机运行window/Linux系统

官网地址&#xff1a;UTM 开源地址&#xff1a;https://github.com/utmapp/UTM 基于 QEMU&#xff08;一个开源的硬件虚拟化工具&#xff09;&#xff0c;UTM 可以在 macOS&#xff08;包括 Apple Silicon M1/M2 和 Intel x86&#xff09;上运行 Windows、Linux、macOS&…...

《C++ vector详解》

目录 1.结构 2.构造函数 无参构造 指定参数构造 迭代器构造 初始化列表构造 3.拷贝构造 4.析构函数 5.遍历 重载【】 5.插入 扩容 尾插 指定位置插入 6.删除 尾删 指定位置删除 1.结构 vector是一个类似于数组一样的容器&#xff0c;里面可以放各种各样的元素…...

【现代深度学习技术】注意力机制07:Transformer

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈PyTorch深度学习 ⌋ ⌋ ⌋ 深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上&#xff0c;结合当代大数据和大算力的发展而发展出来的。深度学习最重…...

浅析 Spring 启动过程:从源码到核心方法

浅析 Spring 启动过程&#xff1a;从源码到核心方法 一、Spring 注解方式启动类 Demo二、Spring 启动过程源码解析​AnnotationConfigApplicationContext构造函数refresh()方法详解 三、refresh()的核心方法/步骤obtainFreshBeanFactory() - 获取Bean工厂prepareBeanFactory(be…...

5G + 区块链:技术巨浪下的新型数字生态!

5G + 区块链:技术巨浪下的新型数字生态! 1. 为什么 5G 和区块链的结合如此重要? 区块链和 5G 这两大技术近几年风头正劲,一个在去中心化数据管理上展现潜力,一个在高吞吐低延迟通信方面带来颠覆。这两者结合,意味着: 更快的数据传输,让区块链交易速度提升,摆脱“低 …...

时序数据库IoTDB分布式架构解析与运维指南

一、IoTDB分布式架构概述 分布式系统由一组独立的计算机组成&#xff0c;通过网络通信&#xff0c;对外表现为一个统一的整体。IoTDB的原生分布式架构将服务分为两个核心部分&#xff1a; ‌ConfigNode&#xff08;CN&#xff09;‌&#xff1a;管理节点&#xff0c;负责管理…...

CertiK荣获以太坊基金会两项资助,领跑zkEVM形式化验证

近日&#xff0c;以太坊基金会公布了2025年第一季度研究资助名单&#xff0c;全球最大的Web3.0安全公司CertiK荣获两项研究资助&#xff0c;源于zkEVM形式化验证竞赛。这不仅是以太坊扩展性战略的里程碑式事件&#xff0c;也进一步彰显了CertiK在零知识证明&#xff08;ZKP&…...

c++和c的不同

c:面向对象&#xff08;封装&#xff0c;继承&#xff0c;多态&#xff09;&#xff0c;STL&#xff0c;模板 一、基础定义与背景 C语言 诞生年代&#xff1a;20世纪70年代&#xff0c;Dennis Ritchie在贝尔实验室开发。主要特点&#xff1a; 过程式、结构化编程面向系统底层…...

光流 | Matlab工具中的光流算法

在MATLAB中,光流算法用于估计图像序列中物体的运动。以下是详细解释及实现步骤: 1. 光流算法基础 光流基于两个核心假设: 亮度恒定:同一物体在连续帧中的像素亮度不变。微小运动:相邻帧之间的时间间隔短,物体运动幅度小。常见算法: Lucas-Kanade (局部方法):假设局部窗…...

@Controller 与 @RestController-笔记

1.Controller与RestController对比 Spring MVC 中 Controller 与 RestController 的功能对比&#xff1a; Controller是Spring MVC中用于标识一个类作为控制器的标准注解。它允许处理HTTP请求&#xff0c;并返回视图名称&#xff0c;通常和视图解析器一起使用来渲染页面。而R…...

LeetCode 热题 100 105. 从前序与中序遍历序列构造二叉树

LeetCode 热题 100 | 105. 从前序与中序遍历序列构造二叉树 大家好&#xff0c;今天我们来解决一道经典的二叉树问题——从前序与中序遍历序列构造二叉树。这道题在 LeetCode 上被标记为中等难度&#xff0c;要求根据给定的前序遍历和中序遍历序列&#xff0c;构造并返回二叉树…...

IP地址查询助力业务增长

IP地址查询的技术基石 IP地址分为IPv4和IPv6&#xff0c;目前IPv4仍广泛应用&#xff0c;它由四个0-255的十进制数组成&#xff0c;如192.168.1.1。而IPv6为应对IPv4地址枯竭问题而生&#xff0c;采用128位地址长度&#xff0c;极大扩充了地址空间。IP地址查询主要依赖庞大的I…...

Nginx核心功能及同类产品对比

Nginx 作为一款高性能的 Web 服务器和反向代理工具&#xff0c;凭借其独特的架构设计和丰富的功能&#xff0c;成为互联网基础设施中不可或缺的组件。以下是其核心功能及与同类产品&#xff08;如 HAProxy、LVS&#xff09;的对比优势&#xff1a; 一、Nginx 核心功能 高性能架…...

抽奖系统-奖品-活动

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言获取奖品列表前端页面活动创建需求分析活动创建后端实现1-控制层实现及校验活动活动创建后端实现2-保存信息活动插入活动奖品插入 整合活动信息存入redis测试活…...

【Java】 volatile 和 synchronized 的比较及使用场景

在 Java 的并发编程中&#xff0c;volatile 和 synchronized 是两个常用的关键字&#xff0c;它们分别用于保证多线程环境中的 可见性 和 原子性&#xff0c;但它们的工作原理和适用场景却有所不同。今天&#xff0c;我们将深入探讨这两个关键字的异同&#xff0c;帮助大家理解…...

javaScript简单版

简介 JavaScript&#xff08;简称:JS)是一门跨平台、面向对象的脚本语言&#xff0c;是用来控制网页行为&#xff0c;实现页面的交互效果。 JavaScript和Java是完全不同的语言&#xff0c;不论是概念还是设计。但是基础语法类似。 组成: ECMAScript:规定了JS基础语法核心知…...

三种常见接口测试工具(Apipost、Apifox、Postman)

三种常见接口测试工具&#xff08;Apipost、Apifox、Postman&#xff09;的用法及优缺点对比总结&#xff1a; &#x1f527; 一、Apipost ✅ 基本用法 支持 RESTful API、GraphQL、WebSocket 等接口调试自动生成接口文档支持环境变量、接口分组、接口测试用例编写可进行前置…...

蓝桥杯13届国B 完全日期

题目描述。 如果一个日期中年月日的各位数字之和是完全平方数&#xff0c;则称为一个完全日期。 例如&#xff1a;2021 年 6 月 5 日的各位数字之和为 20216516&#xff0c;而 16 是一个完全平方数&#xff0c;它是 4 的平方。所以 2021 年 6 月 5 日是一个完全日期。 例如&…...

kafka connect 大概了解

kafka connect Introduction Kafka Connect is the component of Kafka that provides data integration between databases, key-value stores, search indexes, file systems, and Kafka brokers. kafka connect 是一个框架&#xff0c;用来帮助集成其他系统的数据到kafka…...

嵌入式培训之数据结构学习(三)gdb调试、单向链表练习、顺序表与链表对比

目录 一、gdb调试 &#xff08;一&#xff09;一般调试步骤与命令 &#xff08;二&#xff09;找段错误&#xff08;无下断点的地方&#xff09; &#xff08;三&#xff09;调试命令 二、单向链表练习 1、查找链表的中间结点&#xff08;用快慢指针&#xff09; 2、找出…...

MySQL——九、锁

分类 全局锁表级锁行级锁 全局锁 做全库的逻辑备份 flush tables with read lock; unlock tables;在InnoDB引擎中&#xff0c;我们可以在备份时加上参数–single-transaction参数来完成不加锁的一致性数据备份 mysqldump --single-transaction -uroot -p123456 itcast>…...

精益数据分析(57/126):创业移情阶段的核心要点与实践方法

精益数据分析&#xff08;57/126&#xff09;&#xff1a;创业移情阶段的核心要点与实践方法 在创业的浩瀚征程中&#xff0c;每一个阶段都承载着独特的使命与挑战。今天&#xff0c;我们继续秉持共同进步的理念&#xff0c;深入研读《精益数据分析》&#xff0c;聚焦创业的首…...

服务器被打了怎么应对

云服务器遭受攻击该如何应对&#xff1f; 在互联网时代&#xff0c;不少使用云服务器的网络工作者常常会面临网络攻击的威胁。若云服务器未配置完善的防火墙&#xff0c;极易引发服务器宕机&#xff0c;甚至被封禁隔离&#xff08;俗称“陷入黑洞”&#xff09;&#xff0c;进…...

Halcon案例(二):C#联合Halcon回形针以及方向

本案例分3部分 识别效果,分别显示识别前后识别后;代码展示,分别是Halcon源码和Halcon转为C#的代码代码解释(解释在源码中); 原图如下 识别后图像: 其中计算回形针与X轴之间的夹角 Halcon代码: * clip.hdev: Orientation of clips *识别图像中的回形针,并且计算回形针与X轴之间…...

Spyglass:跨时钟域同步(同步单元)

相关阅读 Spyglasshttps://blog.csdn.net/weixin_45791458/category_12828934.html?spm1001.2014.3001.5482 简介 同步单元方案可以用于控制/数据信号跨时钟域同步&#xff0c;该方案使用约束或参数将目标时钟域中单元指定为同步单元&#xff0c;如图1所示。 图1 同步单元方案…...

JAVA异常体系

在 Java 里&#xff0c;异常体系是其错误处理机制的核心内容&#xff0c;它能够帮助开发者有效应对程序运行时出现的各种意外状况。 异常体系的基本架构 它主要包含两个重要分支&#xff1a; Error&#xff08;错误&#xff09;&#xff1a;这类异常是程序自身无法处理的严重…...

Milvus 视角看主流嵌入式模型(Embeddings)

嵌入是一种机器学习概念&#xff0c;用于将数据映射到高维空间&#xff0c;其中语义相似的数据被紧密排列在一起。嵌入模型通常是 BERT 或其他 Transformer 系列的深度神经网络&#xff0c;它能够有效地用一系列数字&#xff08;称为向量&#xff09;来表示文本、图像和其他数据…...

全面解析 Server-Sent Events(SSE)协议:从大模型流式输出到实时通信场景

全面解析 Server-Sent Events&#xff08;SSE&#xff09;协议&#xff1a;从大模型流式输出到实时通信场景 一、SSE 协议概述 Server-Sent Events&#xff08;SSE&#xff09; 是 HTML5 标准中定义的一种基于 HTTP 的服务器向客户端单向推送实时数据的协议。其核心特性包括&a…...

数据库系统概论|第七章:数据库设计—课程笔记

前言 本章讨论数据库设计的技术和方法&#xff0c;主要讨论基于关系数据库管理系统的关系数据库设计问题&#xff0c;而关于数据库的设计过程中&#xff0c;关于数据模型、关系模型等基本概念在前文中已经有详尽介绍&#xff0c;此处便不再赘述&#xff0c;本文主要围绕概念结…...

Java项目拷打(外卖+点评)

一、点评星球&#xff08;黑马点评&#xff09; 1、项目概述 1.1、项目简介 本项目是基于Spring Boot与Redis深度整合的前后端分离的点评平台。系统以Redis为核心技术支撑&#xff0c;重点解决高并发场景下的缓存穿透、击穿、雪崩等问题&#xff0c;涵盖商户展示、优惠券秒杀…...

MCP:开启AI的“万物互联”时代

MCP&#xff1a;开启AI的“万物互联”时代 ——从协议标准到生态革命的技术跃迁 引言&#xff1a;AI的“最后一公里”困境 在2025年的AI技术浪潮中&#xff0c;大模型已从参数竞赛转向应用落地之争。尽管模型能生成流畅的对话、创作诗歌甚至编写代码&#xff0c;但用户逐渐发现…...

【PostgreSQL数据分析实战:从数据清洗到可视化全流程】附录-D. 扩展插件列表(PostGIS/PostgREST等)

&#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 文章大纲 附录D. PostgreSQL扩展插件速查表一、插件分类速查表二、核心插件详解三、安装与配置指南四、应用场景模板五、版本兼容性说明六、维护与优化建议七、官方资源与工具八、附录…...

Spring Boot拦截器详解:原理、实现与应用场景

精心整理了最新的面试资料和简历模板&#xff0c;有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 一、拦截器概述 拦截器&#xff08;Interceptor&#xff09;是Spring MVC框架中用于对请求进行预处理和后处理的组件&#xff0c;主要作用于Controller层。相…...

万字解析:Java字符串

目录 一、 String类 1. String类的初始化 1.1 常用的三种构造String类的方式 1.2 String类如何存储字符串&#xff1f; 2. String类的常用功能方法 2.0 字符串长度的获取 2.1 String对象的比较 2.2 字符/字符串的查找 2.3 字符串的转化 2.4 字符 / 字符串的替换 2.5…...

0514得物、0509滴滴面试总结复盘

目前最欠缺的还是&#xff0c;编码不是很熟&#xff0c;很多都遇到过但是就是写不出来&#xff0c;或者靠背先写一点&#xff0c;然后去加&#xff0c;加的过程没考虑逻辑是不是对的&#xff0c;用滴滴面试官的一句话&#xff0c;就是多刷多练多编码&#xff01; 第二块就是项目…...

记录算法笔记(20025.5.14)对称二叉树

给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true 示例 2&#xff1a; 输入&#xff1a;root [1,2,2,null,3,null,3] 输出&#xff1a;false 提示&#xff1a; 树中节点数目…...

AI大模型从0到1记录学习 linux day23

第 1 章 MySQL概述 1.1 基本概念 1.1.1 数据库是什么&#xff1f; 数据库&#xff08;DB&#xff1a;Database&#xff09;&#xff1a;存储数据的地方。 1.1.2 为什么要用数据库&#xff1f; 应用程序产生的数据是在内存中的&#xff0c;如果程序退出或者是断电了&#xff0c;…...

用git下载vcpkg时出现Connection was reset时的处理

用git安装vcpkg时出现Connect was rest&#xff08;如上图&#xff09;。多谢这位网友的博文解决了问题&#xff1a; 通过:http.sslVerify false全局来设置&#xff0c;执行以下命令&#xff1a; git config --global http.sslVerify "false" 原文链接&#xff1a…...

【数据库复习】SQL语言

一、SQL通用语法与分类 &#xff08;一&#xff09;SQL通用语法 SQL语句的格式通常较为规范&#xff0c;以关键字开头&#xff0c;如CREATE、SELECT、INSERT等&#xff0c;后跟具体的表名、字段名和条件等。在MySQL中&#xff0c;还可以使用help命令获取帮助信息&#xff0c;…...

二叉树——层序遍历

目录 实现层序遍历 判断是否为完全二叉树 实现层序遍历 除了先序遍历&#xff0c;中序遍历&#xff0c;后序遍历外&#xff0c;还可以对二叉树进行层序遍历。设二叉树的结点所在层数为1&#xff0c;层序遍历就是从所在二叉树的根结点出发&#xff0c;首先访问第一层的树根结点…...

Seata源码—2.seata-samples项目介绍

大纲 1.seata-samples的配置文件和启动类 2.seata-samples业务服务启动时的核心工作 3.seata-samples库存服务的连接池配置 4.Seata对数据库连接池代理配置的分析 5.Dubbo RPC通信过程中传递全局事务XID 6.Seata跟Dubbo整合的Filter(基于SPI机制) 7.seata-samples的AT事…...

企业数字化转型背景下的企业知识管理挑战与经验杂谈

一、引言 在数字化转型的浪潮下&#xff0c;企业知识管理正面临前所未有的挑战。随着数据量的急剧增长&#xff0c;企业内部积累的信息呈现出碎片化、分散化的趋势&#xff0c;传统的知识管理体系已难以有效应对这一变革。首先&#xff0c;信息碎片化问题日益严重&#xff0c;…...

第二章:磁盘管理与文件管理

一、磁盘管理 1.windows和Linux磁盘管理的区别 windows资源管理方式 系统一般安装在C盘 C盘下的"Windows"目录是操作系统的核心 C盘下的"Program Files"目录下安装软件 C盘下的"用户"目录是所有的用户&#xff0c;包括超级管理员也在其中 …...

Java版OA管理系统源码 手机版OA系统源码

Java版OA管理系统源码 手机版OA系统源码 一&#xff1a;OA系统的主要优势 1. 提升效率 减少纸质流程和重复性工作&#xff0c;自动化处理常规事务&#xff0c;缩短响应时间。 2. 降低成本 节省纸张、打印、通讯及人力成本&#xff0c;优化资源分配。 3. 规范管理 固化企…...