多线程应用中经常使用lock,在使用这个关键字的时候,经常有个疑问,如果更改了当时的入参,那么是否会变化呢,下面通过代码实例测试一把
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 for (int i = 0; i < 3; i++) 6 { 7 Console.WriteLine("------" + i + "-------"); 8 new helpCommon().test(i); 9 } 10 11 Console.ReadLine(); 12 } 13 } 14 15 public class helpCommon 16 { 17 private static readonly object syncCertObj = new object(); 18 public void test(int i) 19 { 20 Thread initTest = new Thread(() => 21 { 22 lock (syncCertObj) 23 { 24 Console.WriteLine("*******" + i + "*******"); 25 for (int j = 0; j < 5; j++) 26 { 27 Thread.Sleep(1000); 28 Console.WriteLine("*******" + i + "*******"); 29 } 30 } 31 }); 32 initTest.Start(); 33 } 34 }
主线程中发起了三个线程,但是使用通一个锁,同时改变入参 i 的值。最终结果如下
如上图所示,当lock锁住的时候,是按照顺序执行的,同时入参 i 并没有被后面的值影响到。实践出真知。