[C#.NET][VB.NET]執行緒 Thread 共用資料 同步 鎖定

[C#.NET][VB.NET]執行緒 Thread 共用資料 同步 鎖定
使用執行緒時需要注意在多重執行緒之間的共用資料,為了不讓多執行緒共用資料時產生碰撞,.NET 2.0提供了以下類別鎖定資料,確保多執行緒不會存取到其它型別的程式。

使用執行緒時需要注意在多重執行緒之間的共用資料,為了不讓多執行緒共用資料時產生碰撞,.NET 2.0提供了以下類別鎖定資料,確保多執行緒不會存取到其它型別的程式。

1.C# for lock / VB for SyncLock(同步鎖定)

	private void SynRunFuc()
	{
	lock(this)
	{
	for (int i = 0; i < 100000; i++)
	{
	Counter.counter = i++;
	Interlocked.Increment(ref Counter.counter);
	}
	}
	}

 

 

 

 

在VB裡只要將 lock 換成 SyncLock ,將所要鎖定的程式包起來即可

	Private Sub SynRunFuc()
	SyncLock Me
	For i As Integer = 0 To 99999
	Counter.counter = System.Math.Max(System.Threading.Interlocked.Increment(i), i - 1)
	Interlocked.Increment(Counter.counter)
	Next
	End SyncLock
	End Sub

 

2.System.Monitor 類別

比起lock來講,System.Monitor 類別提供的方法又更多了,用法就跟lock一樣,把要保護的資料包起來就好

Enter,指定鎖定。

Exit,釋放鎖定

Wait,等待鎖定。

TryEnter,逾時釋放鎖定。

	Monitor.Enter(this);
	try
	{
	for (int i = 0; i < 100000; i++)
	{
	Counter.counter = i++;
	Interlocked.Increment(ref Counter.counter);
	}
	}
	finally
	{
	Monitor.Exit(this);
	}

 

 

 

 

 

3.ReaderWriteLock 類別:定義鎖定,它支援單一寫入器和多重讀取器,好複雜,跳過跳過…

 

這篇是呼應

[C#.NET] 如何 使用 多執行緒 Thread / 跨執行緒 存取UI
[C#.NET] 如何 使用 BackgroundWorker 多執行緒 / 跨執行緒 存取UI

若有謬誤,煩請告知,新手發帖請多包涵


Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET

Image result for microsoft+mvp+logo