优快云并向bladey@tom.com
锁.二则
2005-12-25
lock
小序
lockkeywordMSDNlock
一.基础铺垫--进程与线程
lock
multi-threadlockSystem.Threading
1
*.exeWindowsPEPortable Executable File FormatPortablePortable ComputerWindowsWindowsloader不过值得注意的是
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
1lock
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()
{
//因为用到了实例方法,所以要锁this,this是本类运行时的实例
//注释掉下面一行,回到哄抢方式,线程的优先级将产生效果
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
C# lock关键字详解
本文通过两个具体示例,详细介绍了C#中的lock关键字及其在多线程环境下的使用方法,包括保证共享资源的安全性和确保线程执行顺序的合理性。

被折叠的 条评论
为什么被折叠?



