Go 的 sync/atomic 操作和互斥锁在保护简单计数器时怎么选,原子操作能保证什么?
Go 的 sync/atomic 操作和互斥锁在保护简单计数器时怎么选,原子操作能保证什么? 本文先给出可直接复述的结论,再用最小代码说明Go atomic 原子操作 mutex 选择的工作方式、判断依据、项目边界和常见误区。
并发编程专题面试题第 3 页,显示第 101–150 题,共找到 448 道完整解析,可继续按分类、标签与关键词缩小范围。
按稳定语义路径排序
Go 的 sync/atomic 操作和互斥锁在保护简单计数器时怎么选,原子操作能保证什么? 本文先给出可直接复述的结论,再用最小代码说明Go atomic 原子操作 mutex 选择的工作方式、判断依据、项目边界和常见误区。
Go 的带缓冲 channel 缓冲满了和空了分别会怎样,缓冲大小如何影响并发行为? 本文先给出可直接复述的结论,再用最小代码说明Go 缓冲 channel 满 空 阻塞的工作方式、判断依据、项目边界和常见误区。
Go 中函数参数把 channel 声明为只读或只写有什么作用? 本文先给出可直接复述的结论,再用最小代码说明Go channel 方向 只读 只写 chan<-的工作方式、判断依据、项目边界和常见误区。
Go 中关闭 channel 的正确姿势是什么,哪些操作会 panic? 本文先给出可直接复述的结论,再用最小代码说明Go close channel panic 向已关闭发送的工作方式、判断依据、项目边界和常见误区。
Go 的 context.WithCancel 和 WithTimeout 的取消信号如何在调用链中传播? 本文先给出可直接复述的结论,再用最小代码说明Go context WithCancel WithTimeout 取消传播的工作方式、判断依据、项目边界和常见误区。
为什么 Go 官方建议不要把 context 存进结构体字段,而要做函数第一个参数? 本文先给出可直接复述的结论,再用最小代码说明Go context 结构体字段 第一个参数的工作方式、判断依据、项目边界和常见误区。
Go 中用 defer 关闭文件、连接等资源时,多个 defer 的执行顺序和错误处理要注意什么? 本文先给出可直接复述的结论,再用最小代码说明Go defer 关闭资源 顺序 错误的工作方式、判断依据、项目边界和常见误区。
Go 的 defer 参数何时求值,defer 在循环里累积会有什么问题? 本文先给出可直接复述的结论,再用最小代码说明Go defer 参数求值 循环 资源释放的工作方式、判断依据、项目边界和常见误区。
Go 的空接口 interface{}(any)能存任何值,滥用它有什么代价? 本文先给出可直接复述的结论,再用最小代码说明Go any 空接口 滥用 类型安全的工作方式、判断依据、项目边界和常见误区。
Go 中什么时候返回 error、什么时候 panic,recover 应该用在哪里? 本文先给出可直接复述的结论,再用最小代码说明Go error panic recover 区别的工作方式、判断依据、项目边界和常见误区。
Go 的 fmt.Errorf %w 包装错误和 errors.Unwrap、Is、As 如何配合工作? 本文先给出可直接复述的结论,再用最小代码说明Go error wrap %w errors.Is errors.As的工作方式、判断依据、项目边界和常见误区。
Go 中 runtime.Goexit 和 return 结束 goroutine 有什么区别? 本文先给出可直接复述的结论,再用最小代码说明Go runtime.Goexit return defer的工作方式、判断依据、项目边界和常见误区。
Go 在循环里启动 goroutine 捕获循环变量会有什么结果,Go 1.22 前后有何不同? 本文先给出可直接复述的结论,再用最小代码说明Go goroutine 循环变量 闭包 Go 1.22的工作方式、判断依据、项目边界和常见误区。
Go 的 goroutine 为什么比操作系统线程轻量,调度上有什么关键设计? 本文先给出可直接复述的结论,再用最小代码说明Go goroutine 轻量 GMP 调度的工作方式、判断依据、项目边界和常见误区。
Go 的接口是隐式实现的,这带来哪些设计上的好处和风险? 本文先给出可直接复述的结论,再用最小代码说明Go interface 隐式实现 优缺点的工作方式、判断依据、项目边界和常见误区。
Go 中接口值为 nil 和接口持有 nil 指针有什么区别,为什么 == nil 判断会失效? 本文先给出可直接复述的结论,再用最小代码说明Go interface nil 陷阱 类型 值的工作方式、判断依据、项目边界和常见误区。
Go 接口变量赋值和比较的开销与限制是什么,什么时候接口不可比较? 本文先给出可直接复述的结论,再用最小代码说明Go interface 比较 动态类型 不可比较的工作方式、判断依据、项目边界和常见误区。
Go 程序 main 函数返回后,还在运行的 goroutine 会怎样,如何正确等待它们? 本文先给出可直接复述的结论,再用最小代码说明Go main 返回 goroutine 退出 WaitGroup的工作方式、判断依据、项目边界和常见误区。
Go 的 map 为什么不能并发读写,会如何失败,怎么改? 本文先给出可直接复述的结论,再用最小代码说明Go map 并发读写 panic fatal error的工作方式、判断依据、项目边界和常见误区。
Go 在 range 遍历 map 过程中增删元素是安全的吗,结果如何? 本文先给出可直接复述的结论,再用最小代码说明Go range map 遍历中删除的工作方式、判断依据、项目边界和常见误区。
Go 遍历 map 的顺序是随机的吗,需要稳定输出时怎么办? 本文先给出可直接复述的结论,再用最小代码说明Go map 遍历顺序 随机的工作方式、判断依据、项目边界和常见误区。
Go 读取 map 中不存在的 key 返回什么,如何区分「不存在」和「存的零值」? 本文先给出可直接复述的结论,再用最小代码说明Go map key 不存在 零值 comma ok的工作方式、判断依据、项目边界和常见误区。
Go 为什么结构体里含 sync.Mutex 后不能再按值拷贝,go vet 如何发现? 本文先给出可直接复述的结论,再用最小代码说明Go Mutex 拷贝 lock by value vet的工作方式、判断依据、项目边界和常见误区。
Go 的 sync.RWMutex 相比 Mutex 在什么读写比例下才值得用,有什么注意事项? 本文先给出可直接复述的结论,再用最小代码说明Go RWMutex Mutex 读多写少的工作方式、判断依据、项目边界和常见误区。
Go 的 nil 切片和空切片有什么区别,序列化和判空时各要注意什么? 本文先给出可直接复述的结论,再用最小代码说明Go nil slice 空切片 区别的工作方式、判断依据、项目边界和常见误区。
Go 的 select 在多个 case 同时就绪时怎么选择,default 分支带来什么行为变化? 本文先给出可直接复述的结论,再用最小代码说明Go select 随机 就绪 default 非阻塞的工作方式、判断依据、项目边界和常见误区。
Go 切片的 len 和 cap 分别决定什么,reslice 时各自起什么约束? 本文先给出可直接复述的结论,再用最小代码说明Go slice len cap 区别的工作方式、判断依据、项目边界和常见误区。
Go 对大切片取子切片后为什么会造成内存无法释放,如何避免? 本文先给出可直接复述的结论,再用最小代码说明Go 子切片 内存泄漏 底层数组的工作方式、判断依据、项目边界和常见误区。
Go 把切片传给函数,为什么函数内改元素生效而 append 不回传? 本文先给出可直接复述的结论,再用最小代码说明Go 切片传参 函数内修改的工作方式、判断依据、项目边界和常见误区。
Go 的 sync.Map 相比加锁的普通 map 适合什么场景,不适合什么? 本文先给出可直接复述的结论,再用最小代码说明Go sync.Map 适用场景的工作方式、判断依据、项目边界和常见误区。
Go 的 sync.Once 如何保证初始化只执行一次,函数返回错误时还能重试吗? 本文先给出可直接复述的结论,再用最小代码说明Go sync.Once 只执行一次 单例的工作方式、判断依据、项目边界和常见误区。
Go 用 make 嵌套创建二维切片后,修改一行会影响其他行吗? 本文先给出可直接复述的结论,再用最小代码说明Go 二维切片 共享 底层数组的工作方式、判断依据、项目边界和常见误区。
Go 的类型断言和 type switch 分别在什么情况下使用,panic 如何避免? 本文先给出可直接复述的结论,再用最小代码说明Go 类型断言 type switch comma ok的工作方式、判断依据、项目边界和常见误区。
Go 的 sync.WaitGroup 的 Add、Done、Wait 调用位置有什么约束,常见错误有哪些? 本文先给出可直接复述的结论,再用最小代码说明Go sync.WaitGroup Add Done Wait 用法的工作方式、判断依据、项目边界和常见误区。
Go 用 channel 实现固定数量 worker 池处理任务时,如何正确关闭和收集结果? 本文先给出可直接复述的结论,再用最小代码说明Go worker pool channel WaitGroup的工作方式、判断依据、项目边界和常见误区。
HTTP 的 If-Match 和 If-Unmodified-Since 如何用条件请求防止并发写覆盖(丢失更新)? 本文先给出可直接复述的结论,再用最小代码说明If-Match If-Unmodified-Since 412 乐观并发的工作方式、判断依据、项目边界和常见误区。
Service Worker 的 Cache Storage 与浏览器 HTTP 缓存是两套机制,fetch 时默认走哪个,如何避免双重缓存策略打架? 本文先给出可直接复述的结论,再用最小代码说明Service Worker CacheStorage HTTP 缓存 优先级的工作方式、判断依据、项目边界和常见误区。
HTTP 409 Conflict 的语义是什么,版本控制冲突场景下如何使用它? 本文先给出可直接复述的结论,再用最小代码说明HTTP 409 冲突 并发更新的工作方式、判断依据、项目边界和常见误区。
HTTP 中 PUT 与 PATCH 的语义差异是什么,分别适合怎样的资源更新? 本文先给出可直接复述的结论,再用最小代码说明PUT PATCH 区别 全量更新 部分更新的工作方式、判断依据、项目边界和常见误区。
HTTP/1.1 时代为绕过并发限制有哪些优化手段,各自的代价是什么 本文先给出可直接复述的结论,再用最小代码说明HTTP/1.1 优化 域名分片 雪碧图的工作方式、判断依据、项目边界和常见误区。
HTTP/2 的 SETTINGS_MAX_CONCURRENT_STREAMS 如何影响客户端并发发送 本文先给出可直接复述的结论,再用最小代码说明HTTP/2 最大并发流 流控的工作方式、判断依据、项目边界和常见误区。
高并发短连接下服务器大量 TIME_WAIT 如何定位和缓解 本文先给出可直接复述的结论,再用最小代码说明TIME_WAIT 过多 排查 解决的工作方式、判断依据、项目边界和常见误区。
CompletableFuture 不指定 Executor 会有什么隐患,IO 型异步任务该如何选线程池? 本文先给出可直接复述的结论,再用最小代码说明CompletableFuture 线程池 ForkJoinPool commonPool的工作方式、判断依据、项目边界和常见误区。
ConcurrentHashMap 在 Java 8 之后为什么用 CAS 加 synchronized 取代分段锁? 本文先给出可直接复述的结论,再用最小代码说明ConcurrentHashMap Java8 CAS synchronized 分段锁 替代原因的工作方式、判断依据、项目边界和常见误区。
for 循环里每次 await 都要等上一个请求回来才发下一个,是串行,总耗时是所有请求之和。用可运行的计时示例对比串行和 Promise.all 并发,讲清并发的关键是先发起再等待,以及限流、失败处理和什么时候必须串行。
限制并发的任务池里,先发的任务不一定先完成,直接 push 结果顺序就乱了。讲清按下标写回结果数组的做法、为什么下标要在 await 之前取,以及按完成顺序处理、按原顺序分段输出这两种变体和失败时的处理。
经典手写题:实现一个 Scheduler,最多同时运行 2 个任务,add 返回 Promise。用一个等待队列加一个运行计数器实现,附 2 3 1 4 输出的完整推演,以及同步抛错、任务失败卡死队列这些常见漏洞。
多个 Promise 同时跑,then 回调基本按谁先兑现谁先执行,而不是按创建顺序。但用 Promise 去 resolve 另一个 Promise 会多等两个微任务,顺序就会反过来。附 Promise.all 结果顺序和真实请求里的处理方式。
forEach 里 return 为什么停不下来?对比 for...of 和 forEach 在跳过当前项、提前结束、处理 async 回调上的区别,以及查找用 some、find,顺序等待用 for...of,并发用 Promise.all 的选择方法。
Kubernetes 用环境变量注入 Secret 比挂载文件多了哪些泄露风险? 本文先给出可直接复述的结论,再用最小代码说明Kubernetes Secret 环境变量 挂载 泄露风险的工作方式、判断依据、项目边界和常见误区。