亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

鎖定與并發

系統 1811 0

在多線程程序中,我們經常需要對要訪問的資源進行加鎖。加鎖的目的是為了同步對資源的訪問,但是,加鎖不可避免的會降低應用的并發量。那么如何在需要加鎖的時候,盡可能地提高并發量了?下面是我的一些經驗,僅供參考。

1.首先,我們要控制好鎖的粒度。

鎖的粒度越大,能支持的并發就越小。

我們只需要將真正需要同步的代碼塊 lock 住,而不需要同步的代碼塊不要放在lock塊中。

當然,鎖的粒度也不是越小越好,粒度太細的鎖會導致編程很繁瑣,而且需要足夠的細心和全面考慮方可保證鎖不會出現問題。

在這點上,有一個特別需要注意的是 -- 事件。 事件最好不要在lock塊中觸發,因為你無法確定組件應用者的事件處理函數會執行多久。 除非,你對一切了然于胸。

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> lock ( this .locker)
{
//

this .OnSomeEvent(); // 觸發事件
}

2.杜絕死鎖的發生。當發生死鎖時,并發將降到最低。

3.區分讀寫。

我們經常使用 lock 關鍵字來鎖定資源,然而,lock沒有辦法區分讀寫。比如,如果當前同時有三個線程在訪問資源,且三個都是 讀取 資源,如果使用lock,那么,在讀取資源上,它們也會被同步處理。幸運的是,.NET為我們提供了讀寫鎖 -- ReaderWriterLock ,使用它,上面的例子便是三個線程可以同時讀取資源。

對于那種讀取多于修改的資源,區分讀寫可以極大地提升并發量。

ReaderWriterLock的使用不如lock來得方便,為此,我封裝了 SmartRWLocker ,它提供了和ReaderWriterLock一樣的功能,但是我們可以像使用lock一樣來使用它,如:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> using ( this .smartRWLocker.Lock( AccessMode .Read))
{
// dosomething
}

SmartRWLocker的實現也相當簡單,如下所示:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> /// <summary>
/// SmartRWLocker簡化了ReaderWriterLock的使用。 zhuweisky2008.11.25
/// </summary>
public class SmartRWLocker
{
private ReaderWriterLock readerWriterLock = new ReaderWriterLock ();

public LockingObjectLock( AccessMode accessMode)
{
return new LockingObject ( this .readerWriterLock,accessMode);
}
}

/// <summary>
/// AccessMode訪問鎖定資源的方式。
/// </summary>
public enum AccessMode
{
Read
= 0 ,
Write
}

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> public class LockingObject :IDisposable
{
private ReaderWriterLock readerWriterLock;
private AccessMode accessMode = AccessMode .Read;

#region Ctor
public LockingObject( ReaderWriterLock _lock, AccessMode _lockMode)
{
this .readerWriterLock = _lock;
this .accessMode = _lockMode;

if ( this .accessMode == AccessMode .Read)
{
this .readerWriterLock.AcquireReaderLock( - 1 );
}
else
{
this .readerWriterLock.AcquireWriterLock( - 1 );
}
}
#endregion

#region IDisposable成員

public void Dispose()
{
if ( this .accessMode == AccessMode .Read)
{
this .readerWriterLock.ReleaseReaderLock();
}
else
{
this .readerWriterLock.ReleaseWriterLock();
}
}
#endregion
}

2009.02.23 附加:

我們都知道,對于集合類,如Lits<>,Dictionary<,>等,

(1)如果其它線程在對其中的元素進行修改(如添加或刪除元素)時,正在對集合進行 枚舉 的線程會拋出異常。

(2)如果有一個線程正在對集合進行修改,另外一個線程調用Contains/ContainsKey,會拋出異常嗎?答案是 不會

鎖定與并發


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 亚洲欧美日韩精品 | 欧美一级毛片在线一看 | 国产福利一区二区精品视频 | 九九精品免视看国产成人 | 日韩亚洲国产综合久久久 | 国产精品亚洲高清一区二区 | 欧美一区二区三 | 伊人久久久综在合线久久在播 | 99r精品在线| 三级黄毛片| 国产伦理精品 | 日本熟hd | 日本免费三区 | 日日插天天干 | 欧美精品亚洲精品日韩 | 99精品国产在这里白浆 | 婷婷色六月 | 麻豆国产原创最新在线视频 | 福利综合网 | 国产欧美在线视频免费 | 精品国精品国产自在久国产应用 | 久久99热精品免费观看k影院 | 色拍拍噜噜噜aⅴ在线观看 色拍拍欧美视频在线看 | 日韩中文字幕精品久久 | 97精品国产高清在线看入口 | 99热这里只有精品国产99 | 中文字幕在线亚洲精品 | 99久久综合 | 一级片手机在线观看 | 久久精品国产午夜伦班片 | 动漫美女h片黄动漫在线观看 | 成人精品一区二区激情 | 中文字幕专区 | 国产伦精品一区二区三区四区 | 亚洲精品国产精品一区二区 | 日韩一区二区三区在线 | 一区二区三区欧美日韩国产 | 午夜精品久久久久久久 | 国产黄色自拍视频 | 日本不卡视频在线视频观看 | 国农村精品国产自线拍 |