线程同步
线程同步:是指在某一时刻只有一个线程可以访问对象。
假设桌上有一个红球,一个白球,两个线程都想拿走红球,则需要考虑线程同步问题。
代码如下:
class Program
{
static void Main(string[] args)
{
RemoveList list = new RemoveList();
list.list.Add("红球");
list.list.Add("白球");
Thread thread1 = new Thread(new ParameterizedThreadStart(list.Remove));
thread1.Name = "thread_1";
Thread thread2 = new Thread(new ParameterizedThreadStart(list.Remove));
thread2.Name = "thread_2";
thread1.Start("红球");
thread2.Start("红球");
Console.ReadKey();
}
}
若不考虑线程同步:
class RemoveList
{
public List<string> list = new List<string>();
public void Remove(object str)
{
var TmbList = list;
if (TmbList.Contains(str.ToString()))
{
Thread.Sleep(1000);
list.Remove(str.ToString());
Console.WriteLine("{0}线程==拿走了=={1}", Thread.CurrentThread.Name, str.ToString());
}
else
{
Console.WriteLine("{0}线程==没拿走=={1}", Thread.CurrentThread.Name, str.ToString());
}
}
}
结果如下:
显然,结果是不对的。只有一个红球,不可能被两个线程同时拿走。
lock
优化代码后:
class RemoveList
{
public List<string> list = new List<string>();
public void Remove(object str)
{
//使用lock关键字解决线程同步问题
lock (this)
{
var TmbList = list;
if (TmbList.Contains(str.ToString()))
{
Thread.Sleep(1000);
list.Remove(str.ToString());
Console.WriteLine("{0}线程==拿走了=={1}", Thread.CurrentThread.Name, str.ToString());
}
else
{
Console.WriteLine("{0}线程==没拿走=={1}", Thread.CurrentThread.Name, str.ToString());
}
}
}
}
结果如下:
Monitor
优化代码后:
class RemoveList
{
public List<string> list = new List<string>();
public void Remove(object str)
{
//使用Monitor解决线程同步问题
try
{
Monitor.Enter(this);
var TmbList = list;
if (TmbList.Contains(str.ToString()))
{
Thread.Sleep(1000);
list.Remove(str.ToString());
Console.WriteLine("{0}线程==拿走了=={1}", Thread.CurrentThread.Name, str.ToString());
}
else
{
Console.WriteLine("{0}线程==没拿走=={1}", Thread.CurrentThread.Name, str.ToString());
}
}
catch { }
finally
{
Monitor.Exit(this);
}
}
}
结果如下: