成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Golang中的同步工具Sync.Once詳解

開發 開發工具
Sync.Once的實現原理是基于原子性操作和鎖的機制,只有一個方法Do(f func()),在第一次調用Do時,會執行函數f并將Once對象標記為已完成;第二次及以后調用Do時,將不再執行函數f。

sync.Once

sync.Once是Golang標準庫中的一個同步工具,作用是保證指定函數只被執行一次,可以用于并發安全的單次初始化、單次執行等場景。

使用方法和示例

sync.Once的實現原理是基于原子性操作和鎖的機制,只有一個方法Do(f func()),在第一次調用Do時,會執行函數f并將once對象標記為已完成;第二次及以后調用Do時,將不再執行函數f。看個例子:

package main

import (
	"fmt"
	"sync"
)

func main() {
	var once sync.Once
	onceBody := func() {
		fmt.Println("只執行一次")
	}
	done := make(chan bool)

	for i := 0; i < 10; i++ {
		go func() {
			once.Do(onceBody)
			done <- true
		}()
	}
	for i := 0; i < 10; i++ {
		<-done
	}
}

本例中開啟了10個goroutine,每個goroutine中都調用了once.Do(onceBody),但onceBody方法只執行了一次。

sync.Once內部使用了一個bool類型的標志位,記錄了對應函數是否已經被執行過。當Do方法第一次被調用時,該方法會獲取鎖并檢查標志位,如果標志位為false,則執行函數并將標志位設置為 true,否則直接返回鎖并退出。通過原子性的CAS操作進行設置和讀取,保證并發的正確性。

假如想要實現一個對象的延遲初始化,只有在第一次被訪問時才進行初始化操作,可以使用sync.Once來實現,代碼如下:

type MyObject struct {
  // 懶加載初始化參數 
  initParams string

  // 初始化后的值
  value string

  // once對象
  once sync.Once
}

// 初始化函數,只被調用一次
func (o *MyObject) init() {
  o.value = "initialized with " + o.initParams
}

// 獲取對象的value字段,如果對象還沒有初始化,則初始化之后再返回
func (o *MyObject) Value() string {
  o.once.Do(o.init)
  return o.value
}

使用了sync.Once實現了對象的懶加載,保證了并發訪問的安全性和初始化只被執行一次。當第一個goroutine調用Value方法時,會執行init函數,初始化MyObject的value字段,并標記MyObject對象的once已經執行過。后續的其他goroutine再調用Value方法時,直接返回value字段,不再進行初始化。

責任編輯:姜華 來源: 今日頭條
相關推薦

2023-06-05 09:23:00

Golang同步工具

2023-06-26 08:28:35

Sync.CondGolang

2024-06-05 11:06:22

Go語言工具

2021-08-29 18:13:03

緩存失效數據

2023-03-28 08:20:07

場景sync.Once?系統

2024-01-08 13:40:00

并發安全? 數量

2023-06-27 08:45:19

原子操作Golang

2023-05-11 08:00:44

Golangsync.Pool

2024-07-02 08:32:19

2022-06-07 08:55:04

Golang單例模式語言

2010-05-19 10:22:07

2023-07-05 08:38:48

GolangGo語言

2023-12-25 09:58:25

sync包Go編程

2023-08-03 08:48:07

Golang接口

2023-05-29 09:25:38

GolangSelect

2023-03-30 07:52:03

Golang接口

2023-11-27 15:02:37

BytesGolang

2023-08-31 09:28:12

Golang可導出函數

2023-10-31 09:10:39

2023-06-09 08:16:09

GolangStruct Tag
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 高清久久 | 日韩一区二区福利视频 | 国产免费一区二区 | 日批免费看 | 性色av香蕉一区二区 | 国产成人午夜电影网 | av黄色免费| 欧美一页| 免费观看国产视频在线 | 黄视频网站免费观看 | www日日日| av天天看 | 国产在线一区二区三区 | 日韩中文字幕在线观看视频 | 国产99久久精品 | 97精品超碰一区二区三区 | 午夜成人免费视频 | 国产一区二区影院 | 亚洲成人精品一区 | 国产一级在线观看 | 97精品一区二区 | 亚洲区在线 | 国产福利在线播放 | 国产精品日韩欧美 | 精品美女视频在线观看免费软件 | 我要看黄色录像一级片 | 精品国产乱码久久久久久丨区2区 | 第四色狠狠 | 成人国产精品视频 | 我想看国产一级毛片 | 国产高清在线精品一区二区三区 | 美女天天操 | 国产精品一区二区在线观看 | 91社区在线观看 | 国产成人免费 | 欧美成ee人免费视频 | 欧美激情黄色 | 四虎影院在线免费观看 | 日韩视频区| 在线免费观看成人 | 人人做人人澡人人爽欧美 |