上一篇中,把线程声明在内部就不会有丢失现象,还可以用lock锁,锁住线程,这样也能不会出现数据丢失。
声明锁
private static readonly object LockThread = new object();
private 避免外部锁定,static 唯一的---Lock(this),readonly 避免引用被改动,object 必须引用类lock要尽量减小作用的范围'
int INum = 0;
List<int> intList = new List<int>();
for (int i = 0; i < 10000; i++)
{
int k = i;
Task.Run(() =>
{
lock (LockThread) //只能是个引用,占据引用,任意时候只有一个线程进入方法,就是变成了单线程
{
INum++;
intList.Add(k);
}
});
}
Thread.Sleep(5000);
Console.WriteLine($"INum={INum} intList.Count = {intList.Count}");
检测LockThread有没有给锁住,没有就我来锁, 只能锁一次,等Lock执行完后,别人才能用。
创建了个TextLock类。线程加锁。用于调用。
public static object objectlock = new object();
public void showpublicLock()
{
for (int i = 0; i < 5; i++)
{
int k = i;
Task.Run(() => {
lock (objectlock)
{
Console.WriteLine($"This is {k} showpublicLock Start。。。{Thread.CurrentThread.ManagedThreadId.ToString("00")}");
Thread.Sleep(2000);
Console.WriteLine($"This is {k} showpublicLock End。。。{Thread.CurrentThread.ManagedThreadId.ToString("00")}");
}
});
}
}
在实例化类,调用showpublicLock,运行时没问题的,如果Lock锁调用TextLock中的锁会怎么样。
for (int i = 0; i < 5; i++)
{
int k = i;
Task.Run(() =>
{
lock (TextLock.objectlock)
{
Console.WriteLine($"This is {k} winfrom Start。。。{Thread.CurrentThread.ManagedThreadId.ToString("00")}");
Thread.Sleep(2000);
Console.WriteLine($"This is {k} winfrom End。。。{Thread.CurrentThread.ManagedThreadId.ToString("00")}");
}
});
}
线程没有出现死锁现象,如果锁住公开的对象,可能就会出现线程互斥。