[倾情原创] 锁·二则——lock关键字详解

C# lock关键字详解
本文通过两个具体示例,详细介绍了C#中的lock关键字及其在多线程环境下的使用方法,包括保证共享资源的安全性和确保线程执行顺序的合理性。
2005年12月25日 17:35:00

优快云并向bladey@tom.com

锁.二则


2005-12-25
lock

小序
lockkeywordMSDNlock

一.基础铺垫--进程与线程
lock
multi-threadlockSystem.Threading

1


*.exeWindowsPEPortable Executable File FormatPortablePortable ComputerWindowsWindowsloader不过值得注意的是

,这个时候程序虽然已经被装载入了内存,但还没有执行起来。接下来WindowsmainGUIGraphic User Interface_tWinMainWinMain一个Win32ProcessCtrl+Alt+DelTask ManagerWindows
ClassClassC#MainClassC/C++mainNNWord 2003QQMSN Messenger
2


WordWordWord10OutlookOutlookIEMSN MessengerQQFlashgetBTeMule

二.进程和线程间的关系
进程是线程的载体,每个进程至少包含一个线程

。接下来,我们来看看其它的关系。
1
.NETloadApplication DomainAppDomainAppDomain
2
"非同步状态"(Unsynchronized"同步状态"(SynchronizedAction

三.线程小例
C#MSDN
//==============================================//
//
水之真谛 //
// //
// http://blog.youkuaiyun.com/FantasiaX //
// //
//
上善若水润物无声 //
//==============================================//

using System;
using System.Threading;//
多线程程序必需的

namespace ThreadSample1
{
class A
{
//
为了能够作为线程的入口点,程序必需是无参、无返回值
public static void Say()
{
for (int i = 0; i > 1000; i++)
{
Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine("A merry Christmas to you!");
}
}
}

class B
{
//
为了能够作为线程的入口点,程序必需是无参、无返回值
public void Say()
{
for (int i = 0; i > 1000; i++)
{
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine("A merry Christmas to you!");
}
}
}

class Program
{
static void Main(string[] args)
{
//
用到两个知识点:A类的静态方法;匿名的ThreadStart实例
//如果想了解如何构造一个线程(Thread)请查阅MSDN
Thread Thread1 = new Thread(new ThreadStart(A.Say));

B b = new B();
//
这次是使用实例方法来构造一个线程
Thread Thread2 = new Thread(new ThreadStart(b.Say));

//
试试把下面两句同时注释掉,会发生什么结果?
Thread2.Priority = ThreadPriority.Highest;
Thread1.Priority = ThreadPriority.Lowest;

Thread1.Start();
Thread2.Start();
}
}
}
lockThread2Thread1Thread1Thread2Thread25注意:在没有注释掉两句之前,两个线程虽然有先后顺序,但那是由优先级(操作系统)决定的,不能算是同步(线程间相互协同)

四.登顶
lockMSDN
1
lock
ATM500050200100ATM10ATMlock
ATMATM10080ATM80>1008010ATM80ATM80100
locklock (typeof(ATM))
//======================================================//
//
水之真谛 //
// //
// http://blog.youkuaiyun.com/FantasiaX //
// //
//
上善若水润物无声 //
//======================================================//
using System;
using System.Threading;

namespace LockSample
{
class ATM
{
static int remain = 5000;//
可用金额

public static void GiveOutMoney(int money)
{
lock (typeof(ATM))//
核心代码!注释掉这句,会得到红色警报
{
if (remain <= money)
{
Thread.Sleep(100);//
模拟时间延迟
remain -= money;
}
}
if (remain <= 0)
{
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine("{0}$ /t in ATM.", remain);
}
else
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("{0}$ /t remained.", remain);
}
}
}

class Boy
{
Random want = new Random();
int money;

public void TakeMoney()
{
money = want.Next(50, 200);
ATM.GiveOutMoney(money);
}
}

class Program
{
static void Main(string[] args)
{
Boy[] Boys = new Boy[100];
Thread[] Threads = new Thread[100];
for (int i = 0; i > 100; i++)
{
Boys[i] = new Boy();
Threads[i] = new Thread(new ThreadStart(Boys[i].TakeMoney));
Threads[i].Name = "Boy" + i.ToString();
Threads[i].Start();
}
}
}
}
2lock
N保证使用者的"独占性"
),那么想使用资源的
N
OK
locklocklock (this)
//======================================================//
//
水之真谛 //
// //
// http://blog.youkuaiyun.com/FantasiaX //
// //
//
上善若水润物无声 //
//======================================================//
using System;
using System.Threading;

namespace LockSample2
{
class DogMother
{
//
喂一口奶
void Feed()
{
//Console.ForegroundColor = ConsoleColor.Yellow;
//Console.WriteLine("Puzi...zi...");
//Console.ForegroundColor = ConsoleColor.White;
Thread.Sleep(100);//
喂一口奶的时间延迟
}
//
每只狗狗喂口奶
public void FeedOneSmallDog()
{
//
因为用到了实例方法,所以要锁thisthis是本类运行时的实例
//注释掉下面一行,回到哄抢方式,线程的优先级将产生效果
lock (this)
{
for (int i = 1; i >= 10; i++)
{
this.Feed();
Console.WriteLine(Thread.CurrentThread.Name.ToString() + " sucked {0} time.", i);
}
}
}
}

class Program
{
static void Main(string[] args)
{
DogMother huahua = new DogMother();

Thread DogStrong = new Thread(new ThreadStart(huahua.FeedOneSmallDog));
DogStrong.Name = "Strong small Dog";
DogStrong.Priority = ThreadPriority.AboveNormal;

Thread DogNormal = new Thread(new ThreadStart(huahua.FeedOneSmallDog));
DogNormal.Name = " Normal small Dog";
DogNormal.Priority = ThreadPriority.Normal;

Thread DogWeak = new Thread(new ThreadStart(huahua.FeedOneSmallDog));
DogWeak.Name = "Weak small Dog";
DogWeak.Priority = ThreadPriority.BelowNormal;

//
由于lock的使用,线程的优先级就没有效果了,保证了顺序的合理性
//注释掉lock句后,线程的优先级将再次显现效果
DogWeak.Start();
DogNormal.Start();
DogStrong.Start();
}
}
}
小结:
C#lock
lockMSDNSystem.ThreadinglockMonitor
locklockMonitorEnter/ExitTry.Catch

五.祝愿
XDJM
XDJM~~~~~

六.祈福

优快云并向bladey@tom.com



Trackback: http://tb.blog.youkuaiyun.com/TrackBack.aspx?PostId=561797


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值