多线程中的“锁”,多线程任务执行的时候,我们可以认为这些线程是并列(并发)执行的。如果多个线程,同时访问一个“资源”(变量、文件),如果没有执行完,其他线程进来同时使用这个资源,就会造成资源的“争夺”。程序会出现问题。可能得不到你要的结果。
所以,使用线程锁,在一个线程使用一个资源的时候,其他线程必须等待。也就是“排队”。
namespace thinger.TaskLockApp
{class TestLock{private int nums = 0;private object myLock = new object();//其实这个也可以不用定义public void TestCount(){//lock (myLock)//{// for (int i = 0; i < 100; i++)// {// nums++;// Console.WriteLine(nums);// }//}//lock (this) //推荐使用{for (int i = 0; i < 100; i++){nums++;Console.WriteLine(nums);}}} public void Start(){for (int i = 0; i < 5; i++){Task.Run(() =>{TestCount();});}}}
}
问题与建议
- 锁对象的选择:
-
- 虽然注释说
myLock
可以不用定义,但事实上它是更优的选择。使用一个私有的、专用的对象作为锁比使用this
更安全,因为它减少了其他代码无意中锁定同一个对象的可能性。
- 虽然注释说
- 静态 vs 实例成员:
-
- 如果你创建了多个
TestLock
的实例,并且希望所有实例都能累加到同一个nums
,你需要将nums
和myLock
定义为static
。否则,每个实例都会有自己独立的nums
和myLock
。
- 如果你创建了多个