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

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

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

sync.Once

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

使用方法和示例

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

package main

import (
	"fmt"
	"sync"
)

func main() {
	var once sync.Once
	onceBody := func() {
		fmt.Println("只執(zhí)行一次")
	}
	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方法只執(zhí)行了一次。

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

假如想要實現一個對象的延遲初始化,只有在第一次被訪問時才進行初始化操作,可以使用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實現了對象的懶加載,保證了并發(fā)訪問的安全性和初始化只被執(zhí)行一次。當第一個goroutine調用Value方法時,會執(zhí)行init函數,初始化MyObject的value字段,并標記MyObject對象的once已經執(zhí)行過。后續(xù)的其他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?系統(tǒng)

2024-01-08 13:40:00

并發(fā)安全? 數量

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-03-30 07:52:03

Golang接口

2023-11-27 15:02:37

BytesGolang

2023-05-29 09:25:38

GolangSelect

2023-08-31 09:28:12

Golang可導出函數

2023-06-09 08:16:09

GolangStruct Tag

2023-10-31 09:10:39

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产免费av在线 | 欧美不卡一区二区三区 | 日韩成人在线播放 | 久久精品视频网站 | 久久男人| 成人小视频在线观看 | 久久合久久| 国产一级片在线播放 | 91视频在线| 九九九视频精品 | 一区视频 | 午夜精品久久久久久不卡欧美一级 | 精品乱码一区二区 | 亚洲精品在线看 | 成年人免费看 | 国产婷婷色综合av蜜臀av | 午夜视频网站 | 国产真实乱对白精彩久久小说 | 国产精品国产三级国产aⅴ原创 | 男女视频在线免费观看 | 国产又爽又黄的视频 | 影音先锋中文字幕在线观看 | 成人午夜在线 | 在线观看中文字幕 | 中文字幕亚洲一区二区三区 | 日本三级电影在线观看视频 | 久久精品欧美一区二区三区不卡 | 四虎影视一区二区 | 欧美一级免费 | 男人天堂久久 | 男女羞羞视频免费看 | 久久高潮 | 天天拍天天射 | 国产精品久久久久久婷婷天堂 | 三级视频在线观看电影 | h片在线观看网站 | 在线视频中文字幕 | 日韩精品在线播放 | 日韩在线观看网站 | 一级片免费观看 | 欧美精品一区免费 |