首页 > 程序开发 > 综合编程 > 其他综合 >

深入浅出多线程系列之四:简单的同步 lock

2011-05-24

1: 考虑下下面的代码: class ThreadUnsafe    {        static int _val1 = 1, _val2 = 1;     &n

1: 考虑下下面的代码:

class ThreadUnsafe
{
static int _val1 = 1, _val2 = 1;

internal static void Go()
{
if (_val2 != 0)
{
Console.WriteLine(_val1
/_val2);
}
_val2
= 0;
}
}

这段代码是非线程安全的,假设有两个线程A,BA,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 <
热点推荐