日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

面试官: 平时开发中你用过读写锁吗?

發布時間:2023/12/4 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 面试官: 平时开发中你用过读写锁吗? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前面實現了一個 帶值變更通知能力的字典類(線程不安全),童鞋們有沒有發現演示代碼使用了?lock語法糖, 這個有沒有問題呢?

沒背景說個鏟鏟

??????同程藝龍基礎架構部推出的數據獲取組件DAL.Connection,我們要做到在切換連接配置時清空數據庫連接池, 這就涉及到切換連接的時候,觸發變更通知。

?.NET 如何清空連接池??面試官:實現一個帶值變更通知能力的Dictionary

仔細閱讀《面試官:實現一個帶值變更通知能力的Dictionary》一文的童靴們有沒有發現一個細節:我使用了lock語法糖無腦加鎖。

這里面有個前置知識點:C# Dictionary線程不安全。
什么叫線程不安全,請看這個???你管這叫"線程安全"?

? ? ? ?這在高并發下會有問題:大多數時候下DBA并不會變更業務方的數據庫連接,這是一個多讀少寫的場景, 我們無腦使用lock在多數時間會人為阻塞請求。

到這個時候,我們就要想到讀寫鎖ReaderWriterLockSlim。

寶藏好物:ReaderWriterLockSlim

Use ReaderWriterLockSlim to protect a resource that is read by multiple threads and written to by one thread at a time. ReaderWriterLockSlim allows multiple threads to be in read mode, allows one thread to be in write mode with exclusive ownership of the lock, and allows one thread that has read access to be in upgradeable read mode, from which the thread can upgrade to write mode without having to relinquish its read access to the resource.

簡而言之:

ReaderWriterLockSlim提供對某資源在某時刻下的多線程同讀 或 單線程獨占寫。
此外,ReaderWriterLockSlim還提供從讀模式無縫升級到獨占寫模式。

總結下來:

讀寫鎖處于以下四種狀態:

1.未進入: 沒有線程進入鎖(或者所有線程退出鎖)2.讀模式:每次調用EnterReadlock時,鎖計數都會增加,但允許您讀取其中的代碼塊。3.寫模式:獨占、排他4.可升級的讀模式(upgradeable read mode):多線程讀,其中一個線程具備在某時刻升級到排他寫模式的可能。

btw,讀寫鎖相比常規lock之外,還具備鎖超時的機制,能避免未知原因持續占有鎖導致的死鎖。

這就很適合我們開發DAL.Connection組件的多讀少寫的場景。?

微軟ReaderWriterLockSlim頁面還很貼心的給了一個基于讀寫鎖的緩存操作封裝類SynchronizedCache。

開箱即用的緩存操作類

基于ReaderWriterLockSlim對線程不安全的Dictionary進行了包裝, 可以作為一個多讀少寫的緩存操作類。

public?class?SynchronizedCache? {private?ReaderWriterLockSlim?cacheLock?=?new?ReaderWriterLockSlim();private?Dictionary<int,?string>?innerCache?=?new?Dictionary<int,?string>();public?int?Count{?get?{?return?innerCache.Count;?}?}public?string?Read(int?key){cacheLock.EnterReadLock();try{return?innerCache[key];}finally{cacheLock.ExitReadLock();}}public?void?Add(int?key,?string?value){cacheLock.EnterWriteLock();try{innerCache.Add(key,?value);}finally{cacheLock.ExitWriteLock();}}public?bool?AddWithTimeout(int?key,?string?value,?int?timeout){if?(cacheLock.TryEnterWriteLock(timeout)){try{innerCache.Add(key,?value);}finally{cacheLock.ExitWriteLock();}return?true;}else{return?false;}}public?AddOrUpdateStatus?AddOrUpdate(int?key,?string?value){cacheLock.EnterUpgradeableReadLock();try{string?result?=?null;if?(innerCache.TryGetValue(key,?out?result)){if?(result?==?value){return?AddOrUpdateStatus.Unchanged;}else{cacheLock.EnterWriteLock();try{innerCache[key]?=?value;}finally{cacheLock.ExitWriteLock();}return?AddOrUpdateStatus.Updated;}}else{cacheLock.EnterWriteLock();try{innerCache.Add(key,?value);}finally{cacheLock.ExitWriteLock();}return?AddOrUpdateStatus.Added;}}finally{cacheLock.ExitUpgradeableReadLock();}}public?void?Delete(int?key){cacheLock.EnterWriteLock();try{innerCache.Remove(key);}finally{cacheLock.ExitWriteLock();}}public?enum?AddOrUpdateStatus{Added,Updated,Unchanged};~SynchronizedCache(){if?(cacheLock?!=?null)?cacheLock.Dispose();} }

緩存操作類SynchronizedCache每次操作會返回操作結果,和常見的字典一樣,不帶值變更通知的能力,我們還是像《面試官:實現一個帶值變更通知能力的Dictionary》?一文那樣,添加值變更事件,注冊變更邏輯。

public?event?EventHandler<ValueChangedEventArgs<string>>?OnValueChanged;//---?節選自AddOrUpdate方法 cacheLock.EnterWriteLock(); try {OnValueChanged?.Invoke(this,?new?ValueChangedEventArgs<string>(key));innerCache[key]?=?value; } finally {cacheLock.ExitWriteLock(); } return?AddOrUpdateStatus.Updated;//---if?(sc.AddOrUpdate(key,?value)?==?SynchronizedCache.AddOrUpdateStatus.Updated) {Console.WriteLine($"已經發生了值變更,原key對應的鍵值已經被重寫。");} }??

輸出旁白

? ? ? 本文記錄了讀寫鎖在日常開發中的實踐,大多數場景都是多讀少寫,讀者可以思考一下是不是也可以將項目中的無腦lock替換為SynchronizedCache。

? ? ? 本文是同程藝龍DAL.Connection組件研發過程的一個小插曲,有心的讀者可以往上翻一翻,了解上下文背景、了解小碼甲的思考過程。

這就像我們高中做數學題,直接看答案并不能快速提升,結合上下文自然、流暢的轉到這個方向才是最重要的。

最后,覺得有用,一鍵三連,激濁揚清??。

目前100000+人已關注加入我們

總結

以上是生活随笔為你收集整理的面试官: 平时开发中你用过读写锁吗?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。