package main;

import (
"sync"
"fmt"
"net"
"runtime"
) //sync.Pool是一个可以存或取的临时对象集合
//sync.Pool可以安全被多个线程同时使用,保证线程安全
//注意、注意、注意,sync.Pool中保存的任何项都可能随时不做通知的释放掉,所以不适合用于像socket长连接或数据库连接池。
//sync.Pool主要用途是增加临时对象的重用率,减少GC负担。 func testTcpConnPool() {
sp2 := sync.Pool{
New: func() interface{} {
conn, err := net.Dial("tcp", ":80");
if err != nil {
return nil;
}
return conn;
},
};
buf := make([]byte, 1024);
//获取对象
conn := sp2.Get().(net.Conn);
//使用对象
conn.Write([]byte("GET / HTTP/1.1 \r\n\r\n"));
n, _ := conn.Read(buf);
fmt.Println("conn read : ", string(buf[:n]));
//打印conn的地址
fmt.Println(conn);
//把对象放回池中
sp2.Put(conn);
//我们人为的进行一次垃圾回收
runtime.GC();
//再次获取池中的对象
conn2 := sp2.Get().(net.Conn);
//这时发现conn2的地址与上面的conn的地址不一样了
//说明池中我们之前放回的对象被全部清除了,显然这并不是我们想看到的
//所以sync.Pool不适合用于scoket长连接或数据库连接池
fmt.Println(conn2);
} func main() {
//我们创建一个Pool,并实现New()函数
sp := sync.Pool{
//New()函数的作用是当我们从Pool中Get()对象时,如果Pool为空,则先通过New创建一个对象,插入Pool中,然后返回对象。
New: func() interface{} {
return make([]int, 16);
},
};
item := sp.Get();
//打印可以看到,我们通过New返回的大小为16的[]int
fmt.Println("item : ", item); //然后我们对item进行操作
//New()返回的是interface{},我们需要通过类型断言来转换
for i := 0; i < len(item.([]int)); i++ {
item.([]int)[i] = i;
}
fmt.Println("item : ", item); //使用完后,我们把item放回池中,让对象可以重用
sp.Put(item); //再次从池中获取对象
item2 := sp.Get();
//注意这里获取的对象就是上面我们放回池中的对象
fmt.Println("item2 : ", item2);
//我们再次获取对象
item3 := sp.Get();
//因为池中的对象已经没有了,所以又重新通过New()创建一个新对象,放入池中,然后返回
//所以item3是大小为16的空[]int
fmt.Println("item3 : ", item3); //测试sync.Pool保存socket长连接池
testTcpConnPool();
}

golang sync.Pool包的使用和一些注意地方的更多相关文章

  1. 深入Golang之sync.Pool详解

    我们通常用golang来构建高并发场景下的应用,但是由于golang内建的GC机制会影响应用的性能,为了减少GC,golang提供了对象重用的机制,也就是sync.Pool对象池. sync.Pool ...

  2. Golang 临时对象池 sync.Pool

    Go 1.3 的sync包中加入一个新特性:Pool.官方文档可以看这里http://golang.org/pkg/sync/#Pool 这个类设计的目的是用来保存和复用临时对象,以减少内存分配,降低 ...

  3. golang语言中sync/atomic包的学习与使用

    package main; import ( "sync/atomic" "fmt" "sync" ) //atomic包提供了底层的原子级 ...

  4. 【记录一个问题】golang中使用sync.Pool反而造成了负优化

    之前有这样的代码:从http收数据后,进行snappy解码: dst := make([]byte, 0, len(httpRequestData)*5) dst, err = snappy.Deco ...

  5. go语言学习--go的临时对象池--sync.Pool

    一个sync.Pool对象就是一组临时对象的集合.Pool是协程安全的. Pool用于存储那些被分配了但是没有被使用,而未来可能会使用的值,以减小垃圾回收的压力.一个比较好的例子是fmt包,fmt包总 ...

  6. [Go] sync.Pool 的实现原理 和 适用场景

    摘录一: Go 1.3 的 sync 包中加入一个新特性:Pool. 官方文档可以看这里 http://golang.org/pkg/sync/#Pool 这个类设计的目的是用来保存和复用临时对象,以 ...

  7. go的临时对象池--sync.Pool

    作者:bigtom链接:https://www.jianshu.com/p/2bd41a8f2254來源:简书   一个sync.Pool对象就是一组临时对象的集合.Pool是协程安全的. Pool用 ...

  8. 深度解密 Go 语言之 sync.Pool

    最近在工作中碰到了 GC 的问题:项目中大量重复地创建许多对象,造成 GC 的工作量巨大,CPU 频繁掉底.准备使用 sync.Pool 来缓存对象,减轻 GC 的消耗.为了用起来更顺畅,我特地研究了 ...

  9. 多图详解Go的sync.Pool源码

    转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com 本文使用的go的源码时14.4 Pool介绍 总所周知Go 是一个自动垃圾回收的编程语言 ...

随机推荐

  1. 【原创】字典攻击教务处(BurpSuite使用)

    0x00 本例使用Burp Suite跑字典爆破教务处登录. 使用账户名:yanjiushengdadui 本示例将结合说明Burp Suite的基本使用. 0x01 BurpSuite代理配置 浏览 ...

  2. Java复习 之流

    在Java程序中 对于数据的输入/输出操作以“流”方式进行:提供了各种各样的流类,用以获取各种不同的种类的数据,程序中通过标准的方法输入或输出数据 Inputstream 例子1: 但是中文会乱码 应 ...

  3. SSM商城项目(一)

    1. 学习计划 1.电商行业的背景. 2.宜立方商城介绍 3.宜立方商城的系统架构 a) 功能介绍 b) 架构讲解 4.工程搭建-后台工程 a) 使用maven搭建工程 b) 使用maven的tomc ...

  4. SpringCloud---Feign上传下载详解

    1.使用原因 公司最近做的项目在用SpringCloud,涉及到了上传.但是Feign本身是不支持文件类型的.所以这里把上传下载的实现分享一下. 2.所需配置 这是自己实现的一个formEncoder ...

  5. eclipse老运行上一个程序之原因总结

    运行eclipse有的时候不运行刚写的类,老是运行别的以前的类,删除了以前的类就啥都不运行.找了好久的原因,最后发现,刚写的类没有main()或者有误.这和java的特点有关,程序的运行总是main( ...

  6. SQLMAP自动注入(一):sqlmap的简单使用和配合burpsuite使用

    python编写,开源 检测方式 基于布尔的盲注检测 基于时间的盲注检测 基于错误的检测 基于union的检测 基于堆叠的检测 优点 数据库直连 -d cookie过期后自动更新cookie信息 可以 ...

  7. JMeter学习(四)参数化(转载)

    转载自 http://www.cnblogs.com/yangxia-test JMeter也有像LR中的参数化,本篇就来介绍下JMeter的参数化如何去实现. 参数化:录制脚本中有登录操作,需要输入 ...

  8. php判断文件夹是不是存在

    function MkFolder($path){   if(!is_readable($path)){     MkFolder( dirname($path) );     if(!is_file ...

  9. phacon只能访问index action

    location / { if (!-e $request_filename) { rewrite ^(.*)$ /index.php?_url=$1 last; break; } }

  10. 约束布局 ConstraintLayout

    app:layout_constraintVertical_bias="0.5"app:layout_constraintHorizontal_bias="0.5&quo ...