golang sync.Pool 指针数据覆盖问题
场景
1. sync.Pool设置
var stringPool = sync.Pool{New: func() any {return new([]string)},
}func NewString() *[]string {v := stringPool.Get().(*[]string)return v
}func PutString(s *[]string) {if s == nil {return}if cap(*s) > 2048 {s = nil} else {*s = (*s)[:0]stringPool.Put(s)}
}
2.使用sync.Pool
func Test_Pool(t *testing.T) {dataSlice1 := demoData()dataSlice2 := demoData()dataSlice2[1] = "test4"fmt.Printf("dataSlice1:%v %p,dataSlice2:%v %p\n", dataSlice1, dataSlice1, dataSlice2, dataSlice2)
}func demoData() []string {strsPtr := NewString()strs := *strsPtrdefer func() {*strsPtr = strsPutString(strsPtr)}()strs = append(strs, "test1", "test2")return strs
}
打印结果:dataSlice1:[test1 test4] 0xc0000a6400,dataSlice2:[test1 test4] 0xc0000a6400
可以看到两个slice地址相同,内部使用同一个地址的数组,导致两次获取的数据互相影响
3.解决方法1
func Test_Pool(t *testing.T) {dataSlice1 := demoData()dataSlice2 := demoData()dataSlice2[1] = "test4"fmt.Printf("dataSlice1:%v %p,dataSlice2:%v %p\n", dataSlice1, dataSlice1, dataSlice2, dataSlice2)
}func demoData() []string {strsPtr := NewString()strs := *strsPtrdefer func() {*strsPtr = strsPutString(strsPtr)}()strs = append(strs, "test1", "test2")// 深复制var items = make([]string, len(strs))copy(items, strs)return items
}
使用深复制,在put回sync.Pool中之前把数据复制返回,但这样资源池失去了意义,获取到资源后有进行了一次内存的申请
4.解决方法2
我们看下golang语言源码怎么解决的
参考 go/src/fmt/print.go 302行 Fprintln方法
func Fprintln(w io.Writer, a ...any) (n int, err error) {p := newPrinter()p.doPrintln(a)n, err = w.Write(p.buf)p.free()return
}
可以看到306行有p.free()代码,newPrinter()和free()之间进行数据处理,数据处理完成之后再把资源返回给sync.Pool
总结:不是任何场景都适合用sync.Pool,需要关注并发情况下资源池中数据同步修改影响的问题。
相关文章:
golang sync.Pool 指针数据覆盖问题
场景 1. sync.Pool设置 var stringPool sync.Pool{New: func() any {return new([]string)}, }func NewString() *[]string {v : stringPool.Get().(*[]string)return v }func PutString(s *[]string) {if s nil {return}if cap(*s) > 2048 {s nil} else {*s (*s)[:0]…...
VUE+内置iframe传值失效问题解决
起因: 公司业务需要计算建筑物截收面积,然后我采用的是openCV来计算,在vue内部引用不了,然后就采用了iframe原生html来完成;功能实现了我想让iframe和vue通信;然后用原有方式试了多次都失败了,i…...
Day31:安全开发-JS应用WebPack打包器第三方库JQuery安装使用安全检测
目录 打包器-WebPack-使用&安全 第三方库-JQuery-使用&安全 思维导图 JS知识点: 功能:登录验证,文件操作,SQL操作,云应用接入,框架开发,打包器使用等 技术:原生开发&…...
Go Zero微服务个人探究之路(十六)回顾api服务和rpc服务的本质
目录 前言 正文 API(Application Programming Interface) RPC(Remote Procedure Call) API 与 RPC 的关系 分布式部署 API 和 RPC 结语 前言 go-zero 是一个基于 Go 语言的微服务框架,它提供了一套简洁的编程模…...
基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的夜间车辆检测系统(深度学习代码+UI界面+训练数据集)
摘要:开发夜间车辆检测系统对于自动驾驶技术具有关键作用。本篇博客详细介绍了如何运用深度学习构建一个夜间车辆检测系统,并提供了完整的实现代码。该系统基于强大的YOLOv8算法,并对比了YOLOv7、YOLOv6、YOLOv5,展示了不同模型间…...
Spring体系架构
目录 核心容器(Core Container) 数据访问/集成(Data Access/Integration) Web开发(Web)...
【PLC】现场总线和工业以太网汇总
1、 现场总线 1.1 什么是现场总线 1)非专业描述: 如下图:“人机界面”一般通过以太网连接“控制器(PLC)”,“控制器(PLC)”通过 “现场总线”和现场设备连接。 2)专业描述(维基百科) 现场总线…...
【吊打面试官系列】Java虚拟机JVM篇 - 关于JVM分析
大家好,我是锋哥。今天分享关于JVM分析的JVM面试题,希望对大家有帮助; 查看JVM进程号的命令是什么? 可以使用 ps ‐ef 和 jps ‐v 等等。 怎么查看剩余内存? 比如: free ‐m, free ‐h, top 命令等等。 1000道 互联网大厂Jav…...
Mysql锁与MVCC
文章目录 Mysql锁的类型锁使用MVCC快照读和当前读读视图【Read View】串行化的解决 exlpain字段解析ACID的原理日志引擎整合SpringBoot博客记录 Mysql锁的类型 MySQL中有哪些锁: 乐观锁(Optimistic Locking):假设并发操作时不会发…...
rancher是什么
Rancher Labs是制作Rancher的公司。Rancher Labs成立于2014年,是一家专注于企业级容器管理软件的公司。它的产品设计旨在简化在分布式环境中部署和管理容器的过程,帮助企业轻松地采用容器技术和Kubernetes。Rancher Labs提供的Rancher平台支持Docker容器…...
阿里云服务器安全狗免费使用多引擎智能查杀引擎
云服务器具有按量付费、降低综合成本等诸多优势,受到很多企业的欢迎。 因此,目前使用的云服务器越来越多。 阿里云是目前云服务器中最具影响力的品牌,因此选择阿里云服务器的用户数量也是最多的。 那么阿里云服务器需要安装杀毒软件吗&#x…...
使用rust实现九九乘法表
rust目前拥有接近c/c的运行速度以及更快的编码支持,所以是很值得学习得一门语言。rust的语法及设计理念与其他的语言也有许多的不同之处。比如其特有的所有权属性。可以让开发者快速的开发出高效的运行程序。对于内存的管理也有极好的管理方案。 在这里使用rust语言…...
突破编程_C++_设计模式(简单工厂模式)
1 简单工厂模式的概念 简单工厂模式(Simple Factory Pattern)是设计模式中的一种创建型模式。它的主要目的是将对象的实例化与使用解耦,使得客户端无需关心对象的创建细节,只需通过工厂类来获取所需的对象。 在简单工厂模式中&a…...
C语言——快速排序
C语言——快速排序 一、 含义二、算法思想三、实现步骤代码实现 一、 含义 快速排序算法是在几种排序算法中效率最高的一个排序算法了,故称为快速排序,它的时间复杂度为:O(nlog2n),相比冒泡排序算法的O(n2)有很大的提升。 二、算…...
FP独立站获客秘籍大揭秘:简单高效,一看就会!
跨境电商的大潮中,越来越多的卖家选择跳出第三方平台的框架,拥抱独立站的自由与机遇。但独立站获客难、成本高的问题,也让不少卖家头疼不已。别担心,今天就来给大家揭秘FP独立站获客的简单高效方法! 首先,…...
英伟达tx2光驱烧录功能支持
今天得到一个任务,是在当前nvidia tx2平台上使能usb cdrom并且调试烧录功能。首先测试给到的信息是不能在平台上使用(废话嘛,能用还用我干嘛) 拿到本地ubuntu机器上看了下,使用brasero等软件可以顺利烧录。 此时捕获了…...
关于stm32(CubeMX+HAL库)的掉电检测以及flash读写
1.掉电检测 CubeMX配置 只需使能PVD中断即可 但是使能了PVD中断后还需要自行配置一些PWR寄存器中的参数,我也通过HAL库进行编写 void PVD_config(void) {//配置PWRPWR_PVDTypeDef sConfigPVD; sConfigPVD.PVDLevel PWR_PVDLEVEL_7; …...
Elastic script_score的使用
script_score介绍 在Elasticsearch中,script_score是在function_score查询中的一种功能强大的方式,允许用户使用内置Painless脚本语言或者其他支持的语言来动态计算每个文档的评分 script_score语法 GET /<索引名>/_search {"query":…...
【Spring Boot 3】获取已注入的Bean
【Spring Boot 3】获取已注入的Bean 背景介绍开发环境开发步骤及源码工程目录结构总结 背景 软件开发是一门实践性科学,对大多数人来说,学习一种新技术不是一开始就去深究其原理,而是先从做出一个可工作的DEMO入手。但在我个人学习和工作经历…...
C# 对于点位置的判断
1.判断点是否在一群点内部 要判断一个点是否在一个由多个点围成的多边形内部(例如一圈点),可以使用射线法(Ray Casting Algorithm)来实现。以下是一个简单的 C# 实现示例 using System;public class Point {public d…...
基于深度学习的水下海洋生物识别(YOLOv12/v11/v8/v5模型+数据集)(源码+lw+部署文档+讲解等)
摘要随着全球海洋生态环境的变化,水下海洋生物的监测与识别变得日益重要。基于深度学习的水下生物识别技术,尤其是YOLO(You Only Look Once)系列目标检测模型,因其高效性和准确性而受到广泛关注。本文提出了一种基于YO…...
ChilloutMix NiPrunedFp32Fix 模型完整教程:从零开始掌握AI图像生成
ChilloutMix NiPrunedFp32Fix 模型完整教程:从零开始掌握AI图像生成 【免费下载链接】chilloutmix_NiPrunedFp32Fix 项目地址: https://ai.gitcode.com/hf_mirrors/emilianJR/chilloutmix_NiPrunedFp32Fix ChilloutMix NiPrunedFp32Fix 是一款基于稳定扩散技…...
政务行业高准确率、可控、符合规范的数据库审计与监测实践方案
一、概要:以高精准风险监测与全链路审计,构筑政务数据安全可控防线在国家数字化治理体系纵深推进的背景下,政务数据已成为驱动政府决策、公共服务与社会管理的关键生产要素。然而,随着政务云、数据共享交换平台的大规模建设&#…...
大以论文与万方、维普、WPS AI 综合对比(2026)
毕业季论文格式问题频发,手动排版耗时、通用模板不匹配、公式图表易错乱是常态。万方、维普以查重为主,WPS AI 偏向通用办公,而大以论文作为7 年专注毕业论文排版的老牌工具,在专业性、稳定性与院校适配性上更具优势。一、核心对比…...
【AI工具】openclaw+离线模型
一、安装 1. 先换系统 apt 国内源(阿里云) # 1. 备份原来的源列表(重要!) sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak# 2. 执行替换,换成清华源 sudo sed -i s/archive.ubuntu.com/mirror…...
[WP]vulhub-dc1 flag全收集,靶机通关writeup超级详细,附带知识点讲解
2026/3/28 前言/提示: 本次记录的背景是作者本人积累2年多的基础知识,但是从来没有打过这种集成环境的靶机,所以仅供个人参考,尽管真的很想分享一些自己的思路也许能帮助读者,但是本次记录也大概率会出现手法惊奇&am…...
3.30作业
例图及要求:分析:1、配置各个交换机接口2、全网仅有两个网段,PC1和PC3在一个网段,PC2、PC4、PC5和PC6在一个网段3、路由器配置互联接口4、AR1上配置DHCP服务5、各个主机间相互ping通成果:...
基于51单片机的电子秤(4挡)proteus、原理图、流程图 1185-基于51单片机的电子秤...
基于51单片机的电子秤(4挡)proteus、原理图、流程图 1185-基于51单片机的电子秤(4挡)proteus、原理图、流程图、物料清单、仿真图、源代码 功能介绍: 1、基本部分 (1)称重范围用开关分为三挡&am…...
服务器速度很慢
表现:20K/s ssh有时候能打开,有时候打不开结果:没有交话费,欠费。解决方式:充值200元现在能打开了,另外添加了一个参数:ProxyPreserveHost off但是很可能没用,因为我一开始直接访问…...
手把手教你用ESP32-S3开发智能语音设备:麦克风选型+WAV录音全流程
ESP32-S3智能语音设备开发实战:从麦克风选型到WAV录音全流程解析 1. 智能语音设备开发的核心挑战与ESP32-S3解决方案 在智能家居和物联网设备爆发式增长的今天,语音交互已成为人机交互的重要方式。然而,开发一款高性能的智能语音设备并非易…...
