深入浅出多线程系列之四:简单的同步 lock
1: 考虑下下面的代码:
class ThreadUnsafe
{
static int _val1 = 1, _val2 = 1;
internal static void Go()
{
if (_val2 != 0)
{
Console.WriteLine(_val1 /_val2);
}
_val2 = 0;
}
}
这段代码是非线程安全的,假设有两个线程A,B,A,B都执行到了Go方法的if判断中,假设_val2=1.所以两个线程A,B都通过if判断,
A执行了Console.WriteLine方法,然后退出if语句,执行_val2=0,此时_val2=0.
但是此时线程B才刚刚执行到Console.WriteLine方法,而此时_val2=0.所以你有可能会得到一个divide by zero 的异常。
为了保证线程安全,我们可以使用Lock关键字,例如:
static readonly object _locker = new object();
static int _val1 = 1, _val2 = 1;
internal static void Go()
{
lock (_locker)
{
if (_val2 != 0)
{
Console.WriteLine(_val1 / _val2);
}
_val2 <补充:综合编程 , 其他综合 ,