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

面試官:Context攜帶數(shù)據(jù)是線程安全的嗎?

開發(fā) 前端
哈嘍,大家好,我是asong。最近一個群里看到一個有趣的八股文,問題是:使用context攜帶的value是線程安全的嗎?這道題其實就是考察面試者對context實現(xiàn)原理的理解,如果不知道context的實現(xiàn)原理,很容易答錯這道題,所以本文我們就借著這道題,再重新理解一遍context攜帶value的實現(xiàn)原理。

本文轉(zhuǎn)載自微信公眾號「Golang夢工廠」,作者AsongGo。轉(zhuǎn)載本文請聯(lián)系Golang夢工廠公眾號。

哈嘍,大家好,我是asong。最近一個群里看到一個有趣的八股文,問題是:使用context攜帶的value是線程安全的嗎?這道題其實就是考察面試者對context實現(xiàn)原理的理解,如果不知道context的實現(xiàn)原理,很容易答錯這道題,所以本文我們就借著這道題,再重新理解一遍context攜帶value的實現(xiàn)原理。

context攜帶value是線程安全的嗎?

先說答案,context本身就是線程安全的,所以context攜帶value也是線程安全的,寫個簡單例子驗證一下:

func main()  {
ctx := context.WithValue(context.Background(), "asong", "test01")
go func() {
for {
_ = context.WithValue(ctx, "asong", "test02")
}
}()
go func() {
for {
_ = context.WithValue(ctx, "asong", "test03")
}
}()
go func() {
for {
fmt.Println(ctx.Value("asong"))
}
}()
go func() {
for {
fmt.Println(ctx.Value("asong"))
}
}()
time.Sleep(10 * time.Second)
}

程序正常運行,沒有任何問題,接下來我們就來看一下為什么context是線程安全的!!!

為什么線程安全?

context包提供兩種創(chuàng)建根context的方式:

  • context.Backgroud()
  • context.TODO()

又提供了四個函數(shù)基于父Context衍生,其中使用WithValue函數(shù)來衍生context并攜帶數(shù)據(jù),每次調(diào)用WithValue函數(shù)都會基于當(dāng)前context衍生一個新的子context,WithValue內(nèi)部主要就是調(diào)用valueCtx類:

func WithValue(parent Context, key, val interface{}) Context {
if parent == nil {
panic("cannot create context from nil parent")
}
if key == nil {
panic("nil key")
}
if !reflectlite.TypeOf(key).Comparable() {
panic("key is not comparable")
}
return &valueCtx{parent, key, val}
}

valueCtx結(jié)構(gòu)如下:

type valueCtx struct {
Context
key, val interface{}
}

valueCtx繼承父Context,這種是采用匿名接口的繼承實現(xiàn)方式,key,val用來存儲攜帶的鍵值對。

通過上面的代碼分析,可以看到添加鍵值對不是在原context結(jié)構(gòu)體上直接添加,而是以此context作為父節(jié)點,重新創(chuàng)建一個新的valueCtx子節(jié)點,將鍵值對添加在子節(jié)點上,由此形成一條context鏈。

獲取鍵值過程也是層層向上調(diào)用直到最終的根節(jié)點,中間要是找到了key就會返回,否會就會找到最終的emptyCtx返回nil。畫個圖表示一下:

image-20220207214507921

總結(jié):context添加的鍵值對一個鏈?zhǔn)降模瑫粩嘌苌碌腸ontext,所以context本身是不可變的,因此是線程安全的。

總結(jié)

本文主要是想帶大家回顧一下context的實現(xiàn)原理,面試中面試官都喜歡隱晦提出問題,所以這就需要我們有很扎實的基本功,一不小心就會掉入面試官的陷阱,要處處小心哦~

好啦,本文到這里就結(jié)束了,我是asong,我們下期見。

創(chuàng)建了讀者交流群,歡迎各位大佬們踴躍入群,一起學(xué)習(xí)交流。入群方式:關(guān)注公眾號獲取。更多學(xué)習(xí)資料請到公眾號領(lǐng)取。


責(zé)任編輯:武曉燕 來源: Golang夢工廠
相關(guān)推薦

2024-11-26 17:43:51

2021-02-19 10:02:57

HTTPSJava安全

2023-11-06 17:39:35

JavaArrayList線程

2020-03-10 08:01:05

Java堆內(nèi)存線程共享

2022-07-18 13:59:43

Redis單線程進程

2020-10-26 07:07:50

線程安全框架

2020-09-26 22:04:32

數(shù)據(jù)安全傳輸HTTPSHTTP 協(xié)議

2022-04-01 12:38:32

cookie代碼面試

2022-07-15 08:22:42

對象符串鍵Symbol

2022-06-24 06:43:57

線程池線程復(fù)用

2023-12-20 14:35:37

Java虛擬線程

2024-11-14 14:53:04

2024-09-11 22:51:19

線程通訊Object

2021-11-29 10:55:11

線程池Java面試

2021-09-07 10:44:33

Java 注解開發(fā)

2024-03-11 18:18:58

項目Spring線程池

2019-05-14 08:44:13

面試面試官線程安全

2024-02-04 10:08:34

2024-04-02 09:45:27

線程池Executors開發(fā)

2024-12-25 15:44:15

點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 久久蜜桃av一区二区天堂 | 亚洲性视频 | 午夜在线影院 | 不卡一二三区 | 黄色一级大片在线免费看产 | 九九综合 | 华人黄网站大全 | 欧美专区日韩专区 | 在线观看中文字幕视频 | 日韩成人在线播放 | 精品香蕉一区二区三区 | 黄色在线播放视频 | 欧美极品在线视频 | 超碰3 | 国产视频一区二区 | 黄色男女网站 | 欧美9999| 久久男人天堂 | 欧美极品一区二区 | 国产视频三区 | 日本精品一区 | 久久天天躁狠狠躁夜夜躁2014 | 国产婷婷综合 | 国产一区二区在线免费观看 | 亚洲精品在线国产 | 最新中文在线视频 | 国产成在线观看免费视频 | 在线成人av | 99亚洲精品 | 九九热在线观看 | 日韩久久久一区二区 | 欧美激情啪啪 | 在线观看国产 | 亚洲播放一区 | 久草在线在线精品观看 | 激情六月丁香 | 日韩日韩日韩日韩日韩日韩日韩 | 中文字幕在线一区二区三区 | 91精品国产91久久久久青草 | 国产在线精品一区 | 国产69久久精品成人看动漫 |