代码块的锁定
锁定某一代码块,让同一时间只有一个线程访问该代码块
被锁定对象不能保证不被外部线程修改
如下面代码所示,有一把锁,每十毫秒修改一次密码,而验证密码的时候,即使锁定了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(); } } >>>>>>>>>>>>>>>>>> 密码正确
|