今天主要介紹下C#的兩種鎖:互斥鎖(lock)和讀寫鎖(ReadWriteLock)
互斥鎖(lock)
lock 關鍵字將語句塊標記為臨界區,方法是獲取給定對象的互斥鎖,執行語句,然後釋放該鎖。當任何一個線程獲取到鎖後,其他線程如果需要使用該臨界區內代碼,則必須等待前一個線程使用完畢後釋放鎖。
代碼示例:
Object thisLock = new Object();
lock (thisLock)
{
// 臨界區代碼塊
}ReadWriteLock定義支持單個寫線程和多個讀線程的鎖。該鎖的作用主要是解決並發讀的性能問題,使用該鎖,可以大大提高數據並發訪問的性能,只有在寫時,才會阻塞所有的讀鎖。
示例代碼:
using System.Collections.Generic;
using System.Windows;
using System.Threading;
namespace FYSTest
{
public partial class MainWindow : Window
{
List list = new List();
private ReaderWriterLock _rwlock = new ReaderWriterLock();
public MainWindow()
{
InitializeComponent();
Thread ThRead = new Thread(new ThreadStart(Read));
ThRead.IsBackground = true;
Thread ThRead2 = new Thread(new ThreadStart(Read));
ThRead2.IsBackground = true;
Thread ThWrite = new Thread(new ThreadStart(Write));
ThWrite.IsBackground = true;
ThRead.Start();
ThRead2.Start();
ThWrite.Start();
}
private void Read()
{
while (true)
{
//使用一個 System.Int32 超時值獲取讀線程鎖。
_rwlock.AcquireReaderLock(100);
try
{
if (list.Count > 0)
{
int result = list[list.Count - 1];
}
}
finally
{
//減少鎖計數,釋放鎖
_rwlock.ReleaseReaderLock();
}
}
}
int WriteCount = 0;//寫次數
private void Write()
{
while (true)
{
//使用一個 System.Int32 超時值獲取寫線程鎖。
_rwlock.AcquireWriterLock(100);
try
{
list.Add(WriteCount++);
}
finally
{
//減少寫線程鎖上的鎖計數,釋放寫鎖
_rwlock.ReleaseWriterLock();
}
}
}
}
}