[Thread] 執行緒同步資源鎖定 – lock / SyncLock

http://www.dotblogs.com.tw/yc421206/archive/2011/01/07/20624.aspx


使用執行緒時常會共用一些資源(方法),為了不讓執行緒同時間進入同一個資源,避免造成資源在演算過程中發生錯亂,可以使用關鍵字C# for lock / VB for SyncLock來鎖定資源,等待執行緒工作完成後才會自動解除鎖定,讓其它的執行緒進來使用資源,如果其他執行緒嘗試進入已鎖定的程式碼,它將會等候、封鎖,直到該物件被釋出;這算是一種簡單的鎖定方式,若你的方法是共用且需要鎖定,那這種鎖定或許就能成為你的選擇。

msdn上建議我們在鎖定是最好是定義要鎖定的 private 物件,或者定義 private static 物件變數保護所有執行個體通用的資料。

private static object _thisLock = new object();
lock (_thisLock)
{
   //TODO
}

基本上這是一個很簡單的用法,接下來我只是要驗証,它在等待中的生命週期,我寫了簡單的code,我在DoWorker方法用了Sleep(10000)是模擬這個工作花了很多時間,方便觀察執行緒狀態。 
image

 

我們可以看到最先進入到DoWorker的是編號12的執行緒,其他的執行緒狀態則是WaitSleepJoin,等到編號12狀態變成Stopped後,編號11才能進入DoWorker方法裡,依此類推下去。

image


### C# 中使用 `GroupBy` 实现线程安全 为了确保在多线程环境中使用 LINQ 的 `GroupBy` 方法时的安全性,可以采用锁机制来保护共享资源。下面是一个具体的例子,在这个例子中,通过 `lock` 关键字实现对集合操作的同步控制。 ```csharp using System; using System.Collections.Generic; using System.Linq; using System.Threading; namespace CSharp.ThreadSafeExample { internal class Program { private static readonly object _syncLock = new object(); private static List<int> numbers = Enumerable.Range(1, 10).ToList(); static void Main(string[] args) { var threads = new List<Thread>(); for (int i = 0; i < 5; ++i){ threads.Add(new Thread(ProcessData)); } foreach(var thread in threads){ thread.Start(); } foreach(var thread in threads){ thread.Join(); } DisplayResults(); } private static void ProcessData(){ IEnumerable<IGrouping<int, int>> groupedItems; lock (_syncLock){ // 确保同一时刻只有一个线程能够访问此代码块 groupedItems = numbers.GroupBy(n => n % 3); foreach (var group in groupedItems){ Console.WriteLine($"Thread ID:{Thread.CurrentThread.ManagedThreadId}, Group Key: {group.Key}"); } } } private static void DisplayResults(){ Console.WriteLine("\nFinal Results:"); var finalResult = numbers.GroupBy(n => n % 3); foreach (var item in finalResult){ Console.WriteLine($"Key={item.Key}: [{string.Join(", ", item)}]"); } } } } ``` 在这个程序里,多个线程尝试读取并分组相同的列表数据。为了避免并发冲突,当执行 `ProcessData()` 函数中的 `GroupBy` 操作时应用了锁定逻辑。这保证了一次仅有一个线程能进入临界区处理数据[^4]。 值得注意的是,虽然这里展示了如何利用 `lock` 来保障基本的线程安全性,但在实际开发过程中还需要考虑更多因素,比如性能影响以及更复杂的场景下可能出现的竞争条件等问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值