CSharp之锁(Lock)

代码块的锁定

锁定某一代码块,让同一时间只有一个线程访问该代码块

被锁定对象不能保证不被外部线程修改

如下面代码所示,有一把锁,每十毫秒修改一次密码,而验证密码的时候,即使锁定了locker对象,依然不能改变locker密码被修改的命运。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
internal class Program
{
class Locker
{
public string key = "";
}
static void Main(string[] args)
{
Locker locker = new Locker();
TaskFactory factory = new TaskFactory();
factory.StartNew(() =>
{
while (true)
{
Thread.Sleep(10);
//修改密码
locker.key = Guid.NewGuid().ToString();
}
});
lock (locker)
{
string key = locker.key;
Thread.Sleep(100);
if (locker.key == key)
{
Console.WriteLine("密码正确");
}
else
{
Console.WriteLine("密码不正确");
}
}
}
}
>>>>>>>>>>>>>>>>>>>
密码不正确

如何改变这种情况呢,根据场景需求,可以在需要改变locker对象的时候,都去锁住该对象,所有线程提前约定好,只能有一个地方获取锁并修改它。毕竟锁的主人和小偷之间不会做这种约定。

将上述代码改变一下,主人就不能随时后台修改密码了,只能拿到锁后才能修改

1
2
3
4
5
6
7
8
9
10
while (true)
{
lock (locker)
{
Thread.Sleep(10);
locker.key = Guid.NewGuid().ToString();
}
}
>>>>>>>>>>>>>>>>>>
密码正确