Go语言之 sync.Once

`sync.Once` 是 `sync` 包下的一个组件,它保证某些操作只会被执行一次,无论有多少个 goroutine 调用它。常见的使用场景包括初始化操作,确保某段代码(如初始化函数)只执行一次。关键思想:通过原子操作和内存屏障的配合,确保在多线程环境下某些操作只会执行一次。 基本使用`sync.Once` 使用起来非常简单,只需要调用 `Do` 方法,传入一个无参无返回值
阅读全文

Go语言之 sync.Pool

`sync.Pool` 是 `sync` 包下的一个组件,可以作为保存临时取还对象的一个“池子”,可以缓存暂时不用的对象,下次需要时直接使用(无需重新分配)。因为频繁的内存分配和回收会对性能产生影响,通过复用临时对象可以避免该问题。适用场景:当多个 goroutine 都需要创建同一个对象时,如果 goroutine 数过多,导致对象的创建数目剧增,进而导致 GC
阅读全文

Go语言的内存对齐

关于内存对齐内存对齐,即字节对齐,指代码编译后在内存的布局与使用方式。现代计算机多为32位或64位地址对齐,若变量内存未对齐,可能触发总线错误。 为什么需要内存对齐CPU访问内存是以字长为单位,而非逐个字节。例如32位CPU,字长为4字节,其访问内存单位也是4字节。这种设计旨在减少CPU访问内存次数,提升访问吞吐量。若不进行内存对齐,会增加CPU访问内存次数,降低性能。同
阅读全文

Golang sync.Cond

在并发编程中,协调多个协程之间的操作是一项常见的需求。条件变量(Condition Variable)是用于解决多个协程之间复杂协调问题的一种机制。条件变量配合互斥锁(`Mutex`)使用,可以让一组协程等待某个条件成立后再继续进行,而不会一直消耗 CPU 资源进行忙等待。本文将详细介绍 Golang 中 `sync` 包提供的 `Cond` 类型,并通过示例代码展示如何使用 `Cond`
阅读全文

Go内存逃逸分析

基本概念逃逸分析(Escape analysis)是由编译器决定内存分配位置的一种技术,不需要程序员明确指定。函数中申请一个新对象时,编译器决定该对象是分配在栈中还是堆中: 如果分配在栈中,函数执行结束后内存会自动回收。 如果分配在堆中,函数执行结束后内存会交给GC(垃圾回收)处理。有了逃逸分析,返回函数局部变量变得可能,这与闭包息息相关。了解哪些场景下对象会逃逸至关
阅读全文

Go垃圾回收机制

前言垃圾即为不再需要的内存块。如果这些垃圾不清理,无法再次被分配使用。在不支持垃圾回收(GC)的编程语言中,这些垃圾内存就会泄露。Golang的垃圾回收也是内存管理的一部分。了解垃圾回收,最好先了解内存分配原理。 垃圾回收算法业界常见的垃圾回收算法有以下几种: 引用计数维护每个对象的引用计数,当引用该对象的对象被销毁时,引用计数减1。当引用计数为0时,回收
阅读全文

URL输入到页面加载的全过程分析

URL输入到页面加载的全过程分析当用户在浏览器中输入一个URL并按下回车键后,背后发生了一系列复杂的过程,最终呈现出用户想要的网页。总体来说,这一过程可以分为以下几个主要步骤:1. DNS解析2. TCP连接3. 发送HTTP请求4. 服务器处理请求并返回HTTP响应5. 浏览器解析渲染页面6. 连接结束 1. DNS解析DNS解析是将
阅读全文

Go语言之Context详解

1. 基本概念 1.1 什么是 Context上下文 `context.Context` 在 Go 语言中用来设置截止日期、同步信号,传递请求相关值的结构体。上下文与 Goroutine 有比较密切的关系,是 Go 语言中独特的设计,在其他编程语言中我们很少见到类似的概念。主要用于超时控制和多Goroutine间的数据传递。注:这里的数据传递主要指全局数据,如 链
阅读全文

MySQL数据库事务和ACID特性

MySQL数据库事务和ACID特性 1. 概述本文将深入探讨数据库事务和ACID(原子性、一致性、隔离性、持久性)特性,并详细解释MySQL是如何实现这些特性的。结论: 一致性(Consistency)是最终目标; 原子性(Atomicity)、隔离性(Isolation)、持久性(Durability)是实现一致性的手段。MySQL通过以下方式实现ACI
阅读全文

Go语言之防缓存击穿利器 Singleflight

Go语言之防缓存击穿利器 Singleflight 1. 缓存击穿在日常开发中,为了提升性能和减轻数据库的压力,通常会对热点数据进行缓存。例如,使用 Redis 缓存用户请求的数据,如果缓存中有数据则直接返回,否则查询数据库并将结果写入缓存。但是,如果缓存失效了,在查询数据库和将数据再次写入缓存的过程中,其他请求也会出现缓存未命中的情况,导致大量请求直接打到数据库,给数据
阅读全文