每日八股文6.2
每日八股-6.2
- Go
- 1.GMP调度原理(这部分多去看看golang三关加深理解)
- 2.GC(同样多去看看golang三关加深理解)
- 3.闭包
- 4.go语言函数是一等公民是什么意思
- 5.sync.Mutex和sync.RWMutex
- 6.sync.WaitGroup
- 7.sync.Cond
- 8.sync.Pool
- 9.panic和recover
- 10.goroutine
Go
1.GMP调度原理(这部分多去看看golang三关加深理解)
Go的GMP调度模型是其并发实现的核心。
- G (Goroutine): 代表一个协程,是Go语言中并发执行的基本单元。它非常轻量,初始栈空间很小,可以创建成千上万个。
- M (Machine): 代表一个内核线程 (OS Thread),是真正执行代码的实体。M的数量通常不会太多。
- P (Processor): 代表一个调度处理器,或者说是G和M之间的调度上下文。P的数量默认等于CPU核心数,可以通过GOMAXPROCS环境变量或运行时函数来设置。
调度流程可以概括为:
-
每个P会维护一个可运行的G队列 (Local Run Queue, LRQ)。
-
M需要获取一个P才能执行G。M会从其绑定的P的LRQ中获取G并执行。
-
如果P的LRQ为空,M会尝试从全局G队列 (Global Run Queue, GRQ)或其他P的LRQ中窃取 (Work Stealing) G来执行,以实现负载均衡。
-
当G执行系统调用或发生阻塞时,它所占用的M会和P解绑(Hand Off),P会去寻找其他空闲的M,或者创建一个新的M来继续执行队列中的其他G。阻塞的G结束后会尝试重新进入某个P的队列等待执行。
-
通过这种方式,GMP模型实现了高效的用户态调度,避免了频繁的内核态线程切换,并能充分利用多核CPU资源。
2.GC(同样多去看看golang三关加深理解)
Go语言的垃圾回收 (GC) 主要是为了自动管理内存,减轻开发者的负担,避免内存泄漏。
Go的GC采用的是并发的三色标记清除 (Concurrent Tri-color Mark-and-Sweep) 算法。
核心思想可以概括为:
- 根对象 (Roots): 从程序的全局变量、Goroutine栈上的指针等根对象开始追踪。
- 三色标记:
- 白色: 初始时所有对象都是白色,表示尚未被访问。GC结束后,仍为白色的对象将被回收。
- 灰色: 对象已被访问,但其引用的其他对象尚未完全扫描。灰色对象是待处理的。
- 黑色: 对象已被访问,并且其引用的所有对象都已被扫描或标记为灰色。黑色对象是存活的。
- 标记阶段 (Marking):
- GC开始时,所有对象标记为白色。
- 从根对象开始,将其标记为灰色并放入待扫描队列。
- 不断从队列中取出灰色对象,将其标记为黑色,并将其引用的白色对象标记为灰色放入队列。
- 这个标记过程是并发的,意味着应用程序的Goroutine可以和GC的标记线程同时运行,从而大大减少STW (Stop-The-World,即cpu完全用来执行垃圾回收,而不执行代码,这样会造成程序的卡顿) 的时间。
- 混合写屏障 (Hybrid Write Barrier,融合了插入写屏障和删除写屏障的思想):
-
GC 开始将栈上的可达对象全部扫描并标记为黑色 (之后不再进行第二次重复扫描,无需 STW),
-
GC 期间,任何在栈上创建的新对象,均为黑色。(混合写屏障加入了这两条对栈区的操作,使得不需要STW)
-
被删除的对象标记为灰色。(删除写屏障)
-
被添加的对象标记为灰色。(插入写屏障)
补充: 插入写屏障:只应用于堆区,如果一个对象在并发过程中创建了一个新的对象,那么新的对象直接标记为灰色。
删除写屏障:如果一个对象在并发过程中被删除,那么直接标记该删除的对象为灰色。
- 清除阶段 (Sweeping): 标记阶段完成后,所有仍然是白色的对象就是不可达的垃圾对象。清除阶段会回收这些白色对象的内存空间。这个阶段也可以部分并发执行。
3.闭包
实现闭包的一个重要前提就是函数是一等公民,它可以向其它类型的参数一样被传递。如果我们有一个函数,并且在这个函数里面又定义了另一个函数,且这个内部函数可以使用外部函数里面定义的变量,这就是闭包。当我们声明一个匿名函数时,他天生就是一个闭包。
4.go语言函数是一等公民是什么意思
函数是一等公民,意味着可以把函数赋值给变量或存储在数据结构中,也可以把函数作为其它函数的参数或者返回值。
5.sync.Mutex和sync.RWMutex
Mutex 也称为互斥锁,互斥锁就是互相排斥的锁,它可以用作保护临界区的共享资源,保证同一时刻只有一个 goroutine 操作临界区中的共享资源。互斥锁 Mutex类型有两个方法,Lock和 Unlock。
type Mutex struct {state int32 // 互斥锁的状态sema uint32 // 信号量,用于控制互斥锁的状态
}
使用互斥锁的注意事项
- Mutex 类型变量的零值是一个未锁定状态的互斥锁
- Mutex 在首次被使用之后就不能再被拷贝(Mutex 是值类型,拷贝会同时拷贝互斥锁的状态)
- Mutex 在未锁定状态(还未锁定或已被解锁),调用 Unlock方法,将会引发运行时错误
- Mutex 的锁定状态与特定 goroutine 没有关联,Mutex 被一个 goroutine 锁定, 可以被另外一个 goroutine 解锁。(不建议使用,必须使用时需要格外小心)
- Mutex 的 Lock方法和 Unlock方法要成对使用,不要忘记将锁定的互斥锁解锁,一般做法是使用 defer
RWMutex 也称为读写互斥锁,读写互斥锁就是读取/写入互相排斥的锁。它可以由任意数量的读取操作的 goroutine 或单个写入操作的 goroutine 持有。读写互斥锁 RWMutex 类型有五个方法,Lock,Unlock,Rlock,RUnlock 和 RLocker。其中,RLocker 返回一个 Locker 接口,该接口通过调用rw.RLock 和 rw.RUnlock 来实现 Lock 和 Unlock 方法。
type RWMutex struct {w Mutex // held if there are pending writerswriterSem uint32 // semaphore for writers to wait for completing readersreaderSem uint32 // semaphore for readers to wait for completing writersreaderCount atomic.Int32 // number of pending readersreaderWait atomic.Int32 // number of departing readers
}
使用读写互斥锁的注意事项
- RWMutex 类型变量的零值是一个未锁定状态的互斥锁
- RWMutex 在首次被使用之后就不能再被拷贝
- RWMutex 的读锁或写锁在未锁定状态,解锁操作都会引发 panic
- RWMutex 的一个写锁 Lock 去锁定临界区的共享资源,如果临界区的共享资源已被(读锁或写锁)锁定,这个写锁操作的 goroutine 将被阻塞直到解锁
- RWMutex 的读锁不要用于递归调用,比较容易产生死锁
- RWMutex 的锁定状态与特定的 goroutine 没有关联。一个 goroutine 可以 RLock(Lock),另一个 goroutine 可以 RUnlock(Unlock)
- 写锁被解锁后,所有因操作锁定读锁而被阻塞的 goroutine 会被唤醒,并都可以成功锁定读锁
- 读锁被解锁后,在没有被其他读锁锁定的前提下,所有因操作锁定写锁而被阻塞的 goroutine,其中等待时间最长的一个 goroutine 会被唤醒
Mutex 和 RWMutex 的区别
- RWMutex 将对临界区的共享资源的读写操作做了区分,RWMutex 可以针对读写操作做不同级别的锁保护。
- RWMutex 读写锁中包含读锁和写锁,它的 Lock和 Unlock 方法用作写锁保护,它的 Rlock和 RUnlock 方法用作读锁保护。
- RWMutex 读写锁中的读锁和写锁关系如下:
- 在写锁处于锁定状态时,操作锁定读锁的 goroutine 会被阻塞。
- 在写锁处于锁定状态时,操作锁定写锁的 goroutine 会被阻塞。
- 在读锁处于锁定状态时,操作锁定写锁的 goroutine 会被阻塞。
- 但是,在读锁处于锁定状态时,操作锁定读锁的 goroutine 不会被阻塞。我们可以理解为读锁保护的临界区的共享资源,多个读操作可以同时执行
6.sync.WaitGroup
sync.WaitGroup 用于阻塞等待一组 Go 程的结束。如果有一个任务可以分解成多个子任务进行处理,同时每个子任务没有先后执行顺序的限制,等到全部子任务执行完毕后,再进行下一步处理。这时每个子任务的执行可以并发处理,这种情景下适合使用sync.WaitGroup。
标准用法
- 启动 Go 程时调用 Add()
- 在 Go 程结束时调用 Done()
- 最后调用 Wait()
package main
import ("fmt""sync"
)
func main() {var wg sync.WaitGroupwg.Add(3)go handlerTask1(&wg)go handlerTask2(&wg)go handlerTask3(&wg)wg.Wait()fmt.Println("全部任务执行完毕.")
}
func handlerTask1(wg *sync.WaitGroup) {defer wg.Done()fmt.Println("执行任务 1")
}
func handlerTask2(wg *sync.WaitGroup) {defer wg.Done()fmt.Println("执行任务 2")
}
func handlerTask3(wg *sync.WaitGroup) {defer wg.Done()fmt.Println("执行任务 3")
}
7.sync.Cond
sync.Cond 条件变量用来协调想要访问共享资源的那些 goroutine,当共享资源的状态发生变化的时候,它可以用来通知被互斥锁阻塞的 goroutine。假设一个场景:有一个协程在异步地接收数据,剩下的多个协程必须等待这个协程接收完数据,才能读取到正确的数据。在这种情况下,如果单纯使用 chan 或互斥锁,那么只能有一个协程可以等待,并读取到数据,没办法通知其他的协程也读取数据。这个时候,就需要有个全局的变量来标志第一个协程数据是否接受完毕,剩下的协程,反复检查该变量的值,直到满足要求。或者创建多个 channel,每个协程阻塞在一个 channel 上,由接收数据的协程在数据接收完毕后,逐个通知。总之,需要额外的复杂度来完成这件事。Go 语言在标准库 sync 中内置一个sync.Cond 用来解决这类问题。和sync.Cond相关的有4个方法:
- NewCond创建实例
- Broadcast广播唤醒所有
- Signal唤醒一个协程
- Wait等待
package main
import ("log""sync""time"
)
var done bool
func main() {// 1. 定义一个互斥锁,用于保护共享数据mu := sync.Mutex{}// 2. 创建一个sync.Cond对象,关联这个互斥锁cond := sync.NewCond(&mu)go read("reader1", cond)go read("reader2", cond)go read("reader3", cond)write("writer", cond)time.Sleep(time.Second * 3)
}
func read(name string, c *sync.Cond) {// 3. 在需要等待条件变量的地方,获取这个互斥锁,并使用Wait方法等待条件变量被通知;c.L.Lock()for !done {c.Wait()}log.Println(name, "starts reading")c.L.Unlock()
}
func write(name string, c *sync.Cond) {// 4. 在需要通知等待的协程时,使用Signal或Broadcast方法通知等待的协程。log.Println(name, "starts writing")time.Sleep(time.Second)c.L.Lock()done = truec.L.Unlock()log.Println(name, "wakes all")c.Broadcast() // 如果不广播, read()方法的 log.Println(name, "starts reading")不会执行
}
/*
输出:2024/10/02 21:27:50 writer starts writing2024/10/02 21:27:51 writer wakes all2024/10/02 21:27:51 reader3 starts reading2024/10/02 21:27:51 reader1 starts reading2024/10/02 21:27:51 reader2 starts reading
*/
8.sync.Pool
sync.pool用于保存和复用临时对象,减少内存分配,降低 GC 压力。使用方式:
- 声明对象池
- Get & Put
package main
import ("encoding/json""fmt""sync"
)
type Student struct {Name string `json:"name"`
}
var studentPool = sync.Pool{New: func() interface{} {return new(Student)},
}
func main() {buf := `{"name":"Mike"}`stu := studentPool.Get().(*Student)fmt.Println(*stu) // {}err := json.Unmarshal([]byte(buf), stu)if err != nil {fmt.Printf("err:%s,err")return}fmt.Println(*stu)studentPool.Put(stu) // {Mike}stu2 := studentPool.Get().(*Student)fmt.Println(*stu2) // {Mike}
}
9.panic和recover
在Go语言中,panic和recover构成了处理程序运行时错误的两个基本机制。它们用于在出现严重错误时,能够优雅地终止程序或恢复程序的执行。
- panic机制
panic是一个内建函数,用于在程序运行时抛出一个错误。当panic被调用时,当前的函数会立即停止执行,并开始逐层向上"冒泡",直到被recover捕获或到达程序的顶层,导致程序崩溃并输出错误信息。
panic通常用于处理那些无法恢复的错误,比如空指针引用、数组越界等。这些错误如果不加以处理,将会导致程序崩溃。
- recover机制
recover是一个内建函数,用于在defer函数中捕获由panic抛出的错误。当panic发生时,程序会立即停止当前函数的执行,并开始逐层向上查找是否有defer语句。如果在defer函数中调用了recover,那么panic会被捕获,程序会恢复正常的执行流程,继续执行defer函数之后的代码。
需要注意的是,recover只有在defer函数中直接调用时才有效。在其他地方调用recover是无效的,它将返回nil并且不会终止panic。
10.goroutine
在Go语言中,goroutine(Go routine)是一种轻量级的执行单元。可以将其理解为一个函数的并发执行,类似于线程,但比线程更轻量级。与传统的线程相比,创建和销毁goroutine的开销非常小。在Go程序中,可以轻松地创建成千上万个goroutine,每个goroutine都能够独立执行,而不需要手动管理线程和锁。这使得在Go语言中实现并发变得非常容易。要创建一个goroutine,只需要在函数调用前加上关键字"go"即可。Go语言的运行时系统(runtime)负责调度和管理goroutine的执行。运行时系统在多个逻辑处理器上调度goroutine,使得它们可以并发执行。以下是goroutine的底层实现原理的一些关键点:
- 栈的动态增长:每个goroutine有一个固定大小的栈空间,初始大小一般很小(几KB)。当需要更多的栈空间时,运行时系统会动态地扩展 栈的大小。这种栈的动态增长使得goroutine可以有效地处理深度递归或者大型数据结构。
- 上下文切换:当一个goroutine遇到阻塞操作(如等待I/O、等待通道的数据等)时,运行时系统会自动将该goroutine切换出执行,并让其他可运行的goroutine继续执行。这种上下文切换是协作式的,是在运行时系统控制下完成的,而不是由操作系统的调度器决定。这使得goroutine的切换非常高效。
- 调度器:Go语言的运行时系统有一个调度器(scheduler),负责在逻辑处理器上调度和管理goroutine的执行。调度器会根据一些策略(如工作窃取)来决定将goroutine分配给哪个逻辑处理器执行。调度器还会处理阻塞的goroutine,并在其可以继续执行时将其重新调度。
- 垃圾回收:运行时系统中的垃圾回收器(garbage collector)负责自动管理内存的分配和回收。垃圾回收器会追踪和收集不再使用的对象,并回收其占用的内存空间。垃圾回收器与goroutine的协作非常紧密,确保在回收内存时不会影响正在执行的goroutine。
- 同步和通信:在多个goroutine之间进行同步和通信通常使用通道(channel)。通道提供了一种安全可靠的方式来传递数据和同步操作。通道的使用能够确保在goroutine之间的数据传递和同步操作的正确性和可靠性。
相关文章:
每日八股文6.2
每日八股-6.2 Go1.GMP调度原理(这部分多去看看golang三关加深理解)2.GC(同样多去看看golang三关加深理解)3.闭包4.go语言函数是一等公民是什么意思5.sync.Mutex和sync.RWMutex6.sync.WaitGroup7.sync.Cond8.sync.Pool9.panic和rec…...

R3GAN利用配置好的Pytorch训练自己的数据集
简介 简介:这篇论文挑战了"GANs难以训练"的广泛观点,通过提出一个更稳定的损失函数和现代化的网络架构,构建了一个简洁而高效的GAN基线模型R3GAN。作者证明了通过合适的理论基础和架构设计,GANs可以稳定训练并达到优异性能。 论文题目:The GAN is dead; long l…...

吴恩达机器学习笔记(1)—引言
目录 一、欢迎 二、机器学习是什么 三、监督学习 四、无监督学习 一、欢迎 机器学习是当前信息技术领域中最令人兴奋的方向之一。在这门课程中,你不仅会学习机器学习的前沿知识,还将亲手实现相关算法,从而深入理解其内部机理。 事实上&…...
信贷风控规则策略累计增益lift测算
在大数据风控业务实践过程中,目前业内主要还是采用规则叠加的办法做策略,但是会遇到一些问题: 1.我们有10条规则,我上了前7条后,后面3条的绝对风险增益是多少? 2.我的规则之间应该做排序吗,最重…...

【笔记】Windows 部署 Suna 开源项目完整流程记录
#工作记录 因篇幅有限,所有涉及处理步骤的详细处理办法请参考文末资料。 Microsoft Windows [Version 10.0.27868.1000] (c) Microsoft Corporation. All rights reserved.(suna-py3.12) F:\PythonProjects\suna>python setup.py --admin███████╗██╗…...

【Elasticsearch】Elasticsearch 核心技术(一):索引
Elasticsearch 核心技术(一):索引 1.索引的定义2.索引的命名规范3.索引的增、删、改、查3.1 创建索引3.1.1 创建空索引 3.2 删除索引3.3 文档操作3.3.1 添加/更新文档(指定ID)3.3.2 添加文档(自动生成ID&am…...
AudioTrack的理解
采样率说的是一秒钟采样多少点 波形频率说的是一个采样周期内有多少个波形 pcm编码说的是 16 还是8 直接决定write的时候使用short还是byte 一、初始化配置 参数设定 需定义音频格式、采样率及缓冲区大小,确保符合硬件支持范围 // 音频参数配置 int sample…...
HTTP请求与HTTP响应介绍及其字段
HTTP请求 请求行:请求行主要包含请求方法、请求URI(统一资源标识符)和HTTP协议版本。例如: GET /index.html HTTP/1.1 请求头(Headers):包含客户端的元数据,为服务器提供了额外信息…...

Fullstack 面试复习笔记:操作系统 / 网络 / HTTP / 设计模式梳理
Fullstack 面试复习笔记:操作系统 / 网络 / HTTP / 设计模式梳理 面试周期就是要根据JD调整准备内容(挠头),最近会混合复习针对全栈这块的内容,目前是根据受伤的JD,优先选择一些基础的操作系统、Java、Nod…...

中科院报道铁电液晶:从实验室突破到多场景应用展望
2020年的时候,相信很多关注科技前沿的朋友都注意到,中国科学院一篇报道聚焦一项有望改写显示产业格局的新技术 —— 铁电液晶(FeLC)。这项被业内称为 "下一代显示核心材料" 的研究,究竟取得了哪些实质性进展…...

智慧政务标准规范介绍:构建高效、协同的政务信息体系
在当今信息化快速发展的时代,智慧政务作为政府数字化转型的重要方向,正逐步改变着政府管理和服务的方式。为了确保智慧政务系统的建设能够有序、高效地进行,国家制定了一系列标准规范,其中GB∕T 21062系列标准《政务信息资源交换体…...
6个月Python学习计划 Day 12 - 字符串处理 文件路径操作
第一周 Day 1 - Python 基础入门 & 开发环境搭建 Day 2 - 条件判断、用户输入、格式化输出 Day 3 - 循环语句 range 函数 Day 4 - 列表 & 元组基础 Day 5 - 字典(dict)与集合(set) Day 6 - 综合实战:学生信息…...
CSS篇-3
1. CSS 中哪些样式可以继承?哪些不可以继承? 可继承的样式: 与字体相关的样式,如:font-size、font-family、color 列表样式:list-style(如 UL、OL 的 list-style-type) 不可继承的样式: 与布局和尺寸相关的样式,如:border、padding、margin、width、height 总结: …...
Unity使用Lua框架和C#框架开发游戏的区别
在Unity中使用Lua框架和C#框架开发游戏有显著的区别,主要体现在性能、开发效率、热更新能力、维护成本等方面。 1. 语言类型与设计目标 维度LuaC#类型动态类型、解释型脚本语言静态类型、编译型面向对象语言设计初衷轻量级嵌入、配置和扩展宿主程序通用开发&#…...
Go开发简历优化指南
一、简历格式与排版 (一)简洁至上 去除多余装饰:在 Go 后台开发简历中,应摒弃那些花哨却无实际作用的元素,比如复杂的封面、页眉、页脚等。设想招聘人员每日要处理大量简历,若你的简历有繁杂的封面设计&a…...

手机照片太多了存哪里?
手机相册里塞满了旅行照片、生活碎片,每次清理都舍不得删?NAS——一款超实用的存储方案,让你的回忆安全又有序~ 1️⃣自动备份解放双手 手机 / 电脑 / 相机照片全自动同步到 NAS,再也不用手动传文件 2️⃣远程访问像…...
【论文笔记】SecAlign: Defending Against Prompt Injection with Preference Optimization
论文信息 论文标题:SecAlign: Defending Against Prompt Injection with Preference Optimization - CCS 25 论文作者: Sizhe Chen - UC Berkeley ;Meta, FAIR 论文链接:https://arxiv.org/abs/2410.05451 代码链接:h…...
IP Search Performance Tests dat/db/xdb/mmdb 结构性能差异对比
IP Search Performance Tests qqzeng-ip by 2025-06-01 测试环境: BenchmarkDotNet v0.15.0 macOS Sequoia 15.5 (24F74) [Darwin 24.5.0] Apple M4 Max, 1 CPU, 14 logical and 14 physical cores .NET SDK 10.0.100-preview.4.25258.110 [Host]: .NET…...

OpenRouter使用指南
OpenRouter 是一个专注于大模型(LLM)API 聚合和路由的服务平台,旨在帮助开发者便捷地访问多种主流大语言模型(如 GPT-4、Claude、Llama 等),并提供统一的接口、成本优化和智能路由功能。以下是它的核心功能…...
Linux 中 m、mm、mmm 函数和 make 的区别
在 Linux 内核开发和 Android 开发中,构建系统通常使用 make 命令来编译和构建项目。而在 Android 开发环境中,还有 m、mm 和 mmm 等命令,这些命令是 Android 构建系统的一部分,提供了更高效和便捷的构建方式。以下将详细介绍这些…...
【MAC】YOLOv8/11/12 转换为 CoreML 格式并实现实时目标检测
在本文中,我们将详细介绍如何将 YOLOv8/11/12 模型转换为 CoreML 格式,并使用该模型在摄像头实时检测中进行目标检测。主要适用于M1、M2、M3、M4芯片的产品。 以下教程在YOLOv8/11/12均适用,此处就以 YOLOv11 举例 目录 前提条件YOLOv8/11/12 转换为 CoreML实时目标检测结论…...
NodeJS全栈WEB3面试题——P7工具链 测试
📊 7.1 Truffle vs Hardhat:各自的优势? 项目TruffleHardhat📦 成熟度老牌框架,社区大,文档全面新一代框架,现代化设计🧪 测试支持内置 Mocha 测试框架支持 Mocha Chai,…...
Mybatis框架各配置文件主要内容详解(二)
ResultMap解决了数据库字段与实体类之间不一致导致的问题 <!--resultMap:设置自定义映射属性:id:表示自定义映射的唯一标识type:查询的数据要映射的实体类的类型子标签:id:设置主键的映射关系result&…...

【优选算法 | 队列 BFS】构建搜索流程的核心思维
算法相关知识点可以通过点击以下链接进行学习一起加油!双指针滑动窗口二分查找前缀和位运算模拟链表哈希表字符串模拟栈模拟(非单调栈)优先级队列 很多人学 BFS 的时候都知道“用队列”,但为什么一定是队列?它到底在整个搜索流程中起了什么作…...
virtio介绍 (三)--spdk作为virtio后端处理nvme盘io的流程--上
目录 一 简介 二 vhost-blk层 三 bdev层 四 lvol层 五 bdev_nvme层 六 硬件驱动层 七 完整取io调用栈流程 一 简介 上节介绍了virito的基本原理,后面根据实际代码介绍virtio的流程。virtio后端代码相对于前端代码更简单,我们先以spdk中的virtio后…...
关于BackgroundScheduler的pause
在APScheduler中,pausedTrue参数的作用对象取决于其使用场景: 1. 作用于调度器(Scheduler) 当在start()方法中使用时(如 scheduler.start(pausedTrue)) 表示调度器本身启动后立即进入暂停状态&…...

设计模式(行为型)-中介者模式
目录 定义 类图结构展示 角色职责详解 模式的优缺点分析 优点 缺点 适用场景 应用实例 与其他模式的结合与拓展 总结 定义 中介者模式的核心思想可以概括为:用一个中介对象来封装一系列的对象交互。这个中介者就像一个通信枢纽,使各对象不需要…...

【Java学习笔记】异常
异常(Exception) 一、基本介绍 在 Java 程序中,将运行中发生的不正常情况称为 “异常”,开发过程中的语法错误和运行时发生的异常情况是不一样的。 二、异常的分类 1. Error(错误):Java 虚拟…...

MySQL:视图+用户管理+访问+连接池原理
一、视图 视图是一个虚拟表,其内容由查询定义。同真实的表一样(相当于是把查询的内容当成一个临时表来使用),视图包含一系列带有名称的列和行数据。视图的数据变化会影响到基表,基表的数据变化也会影响到视图。 1.1 为…...

neo4j 5.19.0安装、apoc csv导入导出 及相关问题处理
前言 突然有需求需要用apoc 导入 低版本的图谱数据,网上资料又比较少,所以就看官网资料并处理了apoc 导入的一些问题。 相关地址 apoc 官方安装网址 apoc 官方导出csv 教程地址 apoc 官方 导入 csv 地址 docker 安装 执行如下命令启动镜像 doc…...