日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
詳解.NET類庫中的簡易讀寫鎖SmartRWLocker

本文將詳細介紹可復(fù)用.NET類庫中的簡易讀寫鎖SmartRWLocker,該類讀寫鎖的功能較.NET內(nèi)置的lock關(guān)鍵字和ReaderWriterLock類要稍微豐富一些。

1.緣起:

對于需要進行線程同步的地方,我們經(jīng)常用的就是.NET內(nèi)置的lock關(guān)鍵字和ReaderWriterLock類。lock的功能相對簡單,因為它不區(qū)分讀寫,也就是說如果都在lock塊中,讀線程都會阻塞另一個讀線程,在很多讀遠遠多于寫的應(yīng)用中,這會極大地折損性能。所以我們也經(jīng)常需要使用讀寫分離的鎖ReaderWriterLock,使用它,我們可以明確的指定是要獲取“讀”鎖還是“寫”鎖。而且,當前的“讀”線程是不會阻塞其它的“讀”線程的。

lock的使用非常簡潔,而ReaderWriterLock類的使用就要繁瑣很多,比如像這樣:

 
 
 
 
  1. private ReaderWriterLock readerWriterLock = new ReaderWriterLock();  
  2. public void Test()  
  3. {  
  4. try 
  5. {  
  6. this.readerWriterLock.AcquireWriterLock(-1);  
  7. // Do Something  
  8. }  
  9. finally 
  10. {  
  11. this.readerWriterLock.ReleaseWriterLock();  
  12. }  

于是,我設(shè)計了ESBasic.Threading.Synchronize.SmartRWLocker來簡化ReaderWriterLock的使用,使得我們可以像使用lock一樣來使用ReaderWriterLock。

2.適用場合:

在大多數(shù)使用ReaderWriterLock的地方都可以使用SmartRWLocker來代替,除非你需要使用某些ReaderWriterLock的特殊功能。SmartRWLocker適用于以下場合:

(1)需要使用讀寫分離的鎖。

(2)不需要設(shè)置等待鎖的超時時間,也就是無限期地等待鎖。

(3)不需要升級/降級鎖,如將讀鎖升級為寫鎖,或?qū)戞i降級為讀鎖。

3.設(shè)計思想與實現(xiàn)

SmartRWLocker的類圖如下:

我們看到SmartRWLocker內(nèi)部就是借助ReaderWriterLock來實現(xiàn)鎖的控制的。而SmartRWLocker只有一個Lock方法,參數(shù)是一個AccessMode枚舉,表示調(diào)用者是希望獲取讀鎖還是寫鎖,另外該方法返回一個LockingObject對象。LockingObject的生命周期很有意思,LockingObject對象產(chǎn)生的時候,就是獲取鎖的時刻,其被銷毀的時候(Dispose方法),就是釋放鎖的時刻。所以LockingObject對象的生命周期就是占用鎖的時間段。

IDisposable接口與using結(jié)合起來使用,會使得語法非常簡單可讀。我們可以這樣來簡潔地使用SmartRWLocker:

 
 
 
 
  1. private SmartRWLocker smartRWLocker = new SmartRWLocker();  
  2. public void Test2()  
  3. {  
  4. using(this.smartRWLocker.Lock(AccessMode.Write))  
  5. {  
  6. // Do Something  
  7. }  

這就非常類似lock的使用方式了。

最后,LastRequireReadTime和LastRequireWriteTime屬性記錄了最后一次獲取讀寫鎖的時間 -- 即從一個側(cè)面記錄了我們對目標資源最后一次進行讀寫的時間。

4. 使用時的注意事項

SmartRWLocker簡化了ReaderWriterLock的使用,但是正如有得必有失,它也損失了一些ReaderWriterLock的功能,正如在適用場合中介紹的,使用SmartRWLocker無法設(shè)置獲取鎖的超時時間,也無法升級/降級鎖的性質(zhì)。幸運的是,大多數(shù)情況下,我們都用不到這些高級一點的特性,所以,SmartRWLocker還是有它存在的價值的。

如果你的應(yīng)用需要使用SmartRWLocker不提供的特性,那只有轉(zhuǎn)向使用ReaderWriterLock本身了。這也未必是個壞主意。

使用任何類型的鎖的時候,你都需要注意鎖的“粒度”的問題,即你的鎖要鎖住的范圍有多大。粒度太大,會降低系統(tǒng)的并發(fā);粒度太細,又會使得編程相當繁瑣。所以在設(shè)計時需要進行權(quán)衡,為你的鎖選擇一個恰當?shù)牧6仁欠浅V匾摹?/p>

5.擴展


文章標題:詳解.NET類庫中的簡易讀寫鎖SmartRWLocker
轉(zhuǎn)載源于:http://m.5511xx.com/article/dpggijs.html