jydg 发表于 2018-9-19 14:01:36

Golang学习 - sync 包

------------------------------------------------------------  

  
临时对象池
  

  
  Pool 用于存储临时对象,它将使用完毕的对象存入对象池中,在需要的时候取出来重复使用,目的是为了避免重复创建相同的对象造成 GC 负担过重。其中存放的临时对象随时可能被 GC 回收掉(如果该对象不再被其它变量引用)。
  

  
  从 Pool 中取出对象时,如果 Pool 中没有对象,将返回 nil,但是如果给 Pool.New 字段指定了一个函数的话,Pool 将使用该函数创建一个新对象返回。
  

  
  Pool 可以安全的在多个例程中并行使用,但 Pool 并不适用于所有空闲对象,Pool 应该用来管理并发的例程共享的临时对象,而不应该管理短寿命对象中的临时对象,因为这种情况下内存不能很好的分配,这些短寿命对象应该自己实现空闲列表。
  

  
  Pool 在开始使用之后,不能再被复制。
  

  
------------------------------
  

  
type Pool struct {
  
// 创建临时对象的函数
  
New func() interface{}
  
}
  

  
// 向临时对象池中存入对象
  
func (p *Pool) Put(x interface{})
  

  
// 从临时对象池中取出对象
  
func (p *Pool) Get() interface{}
  

  
------------------------------------------------------------
  

  
单次执行
  

  
  Once 的作用是多次调用但只执行一次,Once 只有一个方法,Once.Do(),向 Do 传入一个函数,这个函数在第一次执行 Once.Do() 的时候会被调用,以后再执行 Once.Do() 将没有任何动作,即使传入了其它的函数,也不会被执行,如果要执行其它函数,需要重新创建一个 Once 对象。
  

  
  Once 可以安全的在多个例程中并行使用。
  

  
------------------------------
  

  
// 多次调用仅执行一次指定的函数 f
  
func (o *Once) Do(f func())
  

  
------------------------------
  

  
// 示例:Once
  
func main() {
  
var once sync.Once
  
onceBody := func() {
  
fmt.Println("Only once")
  
}
  
done := make(chan bool)
  
for i := 0; i < 10; i++ {
  
go func() {
  
once.Do(onceBody) // 多次调用只执行一次
  
done
页: [1]
查看完整版本: Golang学习 - sync 包