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

聊聊Interlocked.CompareExchange吧?

開發(fā) 前端
Interlocked.CompareExchange這玩意用法被講的很爛了,為何再次被提及,主要看了下官網(wǎng)對其使用描述可能對于部分童鞋來講具備一定迷惑性,需我們進(jìn)一步消化下,話不多講,我們來看看吧~~~

[[379567]]

Interlocked.CompareExchange這玩意用法被講的很爛了,為何再次被提及,主要看了下官網(wǎng)對其使用描述可能對于部分童鞋來講具備一定迷惑性,需我們進(jìn)一步消化下,話不多講,我們來看看吧~~~

淺談如標(biāo)題

關(guān)于啥時(shí)候用此語法,這.....此處省略若干字,上代碼

  1. var location = 1; 
  2.  
  3. var value = 3; 
  4.  
  5. var compared = 1; 
  6.  
  7. Interlocked.CompareExchange(ref location, value, compared); 

若原始值(location)與比較值(compared)一致,則將當(dāng)前值(value)替換原始值。如圖上述,此時(shí)原始值將為3,毫無疑問,我們很清楚這是基本用法

問題來了,該語法既可比較基本類型也可比較引用對象

當(dāng)比較對象時(shí),官方還特此備注注意:

比較對象的引用相等性,而不是值相等性。結(jié)果,兩個(gè)具有相同值類型(例如,整數(shù)3)的裝箱實(shí)例始終看起來不相等,并且不執(zhí)行任何操作。不要將此重載用于值類型。

初次看,稍不注意的迷惑性來了,解釋如下截圖

從描述上看,一部分童鞋是不是會認(rèn)為,原始值為空,則會引發(fā)空引用異常,如下代碼

  1. object o1 = null
  2.  
  3. object o2 = null
  4.  
  5. Interlocked.CompareExchange(ref o1, o2, null); 

運(yùn)行上述代碼將不會拋出空引用異常,這是為何?難道官方解釋有誤,接下來我們深入探討下

深談如標(biāo)題

若對C語言有所了解,則不會存在疑惑,官方解釋為空指針(不是空),而我們代碼是空引用,二者不可同日而語

C#中對于引用類型,定義現(xiàn)有的變量必將存在引用,所以在C#中不可能存在空引用,所以我們是不是可以認(rèn)為必然不會存在拋出空引用異常

官方解釋為空指針和null其實(shí)并不是同一個(gè)概念,如此一解釋,極易引起概念混淆,還不如去掉,顯得有點(diǎn)多余

再想想,也不是那么絕對,個(gè)人以為,至少在托管情況下理論上應(yīng)該不會拋出任何異常,非托管情況下可能沒有保證,或者通過IL操作底層,也會觸發(fā)上述空引用異常

綜上個(gè)人理解,官方解釋談不上迷惑性,只是好像有點(diǎn)會引起概念混淆,讓部分童鞋以為不能傳遞空,希望沒將各位繞暈圖片

那么我們在哪些場景下會用到上述原始值為空的情況呢?比如確保對象初始化,如下:

  1. public class Order 
  2.     public Address Address 
  3.     { 
  4.         get 
  5.         { 
  6.             return CreateAddress(); 
  7.         } 
  8.     } 
  9.  
  10.    private Address CreateAddress() => new Address(); 
  11.  
  12. public class Address 

當(dāng)我們在Order內(nèi)部使用Address時(shí),確保其實(shí)例已完全初始化,如下:

  1. static Address EnsureAddressInitialized() 
  2.     var order = new Order(); 
  3.  
  4.     Func<Order, Address> func = f => f.Address; 
  5.  
  6.     Address target = null
  7.  
  8.     var result = Interlocked.CompareExchange(ref target, func(order), null); 
  9.  
  10.     Console.WriteLine(result == null); 
  11.  
  12.     Console.WriteLine(target); 
  13.  
  14.     return target!; 

上述方法返回對象實(shí)例時(shí),我們使用C# 8.0語法表明對象實(shí)例絕不可能為空

該語法有返回值,那打印結(jié)果是否和替換后的原始值一樣呢?不是,除了替換原始值外,針對所有情況,返回值都是最初原始值即舊值。

據(jù)我所知,該語法底層直接操作CPU處理器指令,當(dāng)然也是原子性操作,即便是操作系統(tǒng)也無法執(zhí)行中斷操作,線程可以在指令執(zhí)行之前被搶占,但在指令執(zhí)行期間不會被搶占,換言之,絕不會出現(xiàn),當(dāng)原始值和比較值比較相等時(shí),而另一線程指令更改原始值的情況

基于上述理論,所以才有了網(wǎng)上大多數(shù)通過循環(huán)方式對其返回結(jié)果賦最新原始值實(shí)現(xiàn)并發(fā)無鎖修改操作

  1. public static Address EnsureAddressInitialized( 
  2.   ref Address target, 
  3.   Order order, Func<Order, Address> func) 
  4.  { 
  5.       if (target != null
  6.       { 
  7.         return target; 
  8.       } 
  9.  
  10.       while (Interlocked.CompareExchange(ref target, func(order), null) == null
  11.       { 
  12.         break; 
  13.       } 
  14.  
  15.       return target; 
  16.  } 

為避免上述沒必要的循環(huán)操作,同時(shí)也為避開CPU緩存,我們進(jìn)一步進(jìn)行代碼優(yōu)化,通過使用Volatile關(guān)鍵字獲取內(nèi)存最新存儲數(shù)據(jù),最終演變成如下這般

  1. public static Address EnsureAddressInitialized( 
  2.             ref Address target, 
  3.             Order order, Func<Order, Address> func) 
  4.     var tmp = Volatile.Read(ref target); 
  5.     if (tmp != null
  6.     { 
  7.       return tmp; 
  8.     } 
  9.  
  10.     Interlocked.CompareExchange(ref target, func(order), null); 
  11.  
  12.     return target!; 

概念的混淆可能會存在使用上的疑惑,同時(shí)我們基于理論逐步優(yōu)化,實(shí)現(xiàn)并發(fā)無鎖修改操作

 

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

2023-11-09 08:14:07

時(shí)間窗口限流

2020-09-04 07:33:12

Redis HashMap 數(shù)據(jù)

2021-01-12 08:21:46

Jvm類加載機(jī)制運(yùn)行區(qū)數(shù)據(jù)

2024-01-15 06:42:00

高并發(fā)熱點(diǎn)賬戶數(shù)據(jù)庫

2020-05-06 22:07:53

UbuntuLinux操作系統(tǒng)

2020-02-18 15:15:05

Handler消息隊(duì)列執(zhí)行任務(wù)

2013-04-19 10:23:25

編程

2014-07-28 14:46:40

Service

2023-08-23 18:56:46

2022-11-30 08:19:15

內(nèi)存分配Go逃逸分析

2023-06-30 07:51:44

springboot初始化邏輯

2022-02-09 11:02:16

JavaScript前端框架

2021-06-02 08:33:31

TPCTPC-H系統(tǒng)

2023-08-07 08:32:05

RocketMQ名字服務(wù)

2023-03-27 08:49:51

2023-02-24 16:46:25

Glide緩存機(jī)制

2023-09-11 08:50:03

Maven工具關(guān)系管理

2023-09-06 18:16:14

自動發(fā)現(xiàn)Zabbix網(wǎng)絡(luò)

2024-02-04 09:00:00

向量查詢數(shù)據(jù)檢索MyScale

2021-06-26 07:40:45

Greenplum集群部署
點(diǎn)贊
收藏

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

主站蜘蛛池模板: 在线观看免费av网 | 精品影院 | 国产成人一区二区三区久久久 | 亚洲一区二区网站 | 精品久久久久久中文字幕 | 欧美一区二区激情三区 | 国产黄色大片在线免费观看 | 69亚洲精品| 亚洲综合一区二区三区 | 三级特黄特色视频 | 日本久久久影视 | 五月网婷婷 | 男女视频在线观看网站 | 中文字幕亚洲一区 | 午夜影院普通用户体验区 | 成人在线免费视频 | 亚洲a视 | 午夜电影一区二区 | 精品一区二区三区在线视频 | 一级毛片在线视频 | 久久国产精品久久国产精品 | 日韩高清成人 | 亚洲成人免费视频 | 欧美日韩在线观看一区 | 黄色成人在线观看 | 91免费看片神器 | 欧美高清性xxxxhd | 国产精品乱码一区二三区小蝌蚪 | 国产精品99 | 日本精品免费 | 国产精品久久久久久久久免费高清 | 北条麻妃99精品青青久久主播 | av电影手机在线看 | 午夜免费视频 | 精品在线观看一区二区 | 亚洲欧美日韩电影 | 国产黑丝av| 一区二区av| 在线成人av | 国产免费让你躁在线视频 | 国产欧美精品区一区二区三区 |