使用锁时的注意事项

时间:2011-02-11 10:16:15

标签: c#

我有一个小小的困惑。我在c#中使用一个名为status with property的静态变量,如下所示

private static bool status;

public static bool Status   
{  
   get { return status; }  
   set { status = value; }  
}

现在我已分别启动2个线程 第一个线程使用变量status的属性将值设置为true / false 第二个线程使用属性获取变量状态的值。

在这种情况下,我想会发生什么事情 如果第一个线程尝试更新变量状态的值,而第二个线程尝试读取变量状态的值

我是否需要在属性内部对此变量状态使用lock语句来处理线程同步或不需要? 有人可以通过澄清这个疑问帮助我吗?

2 个答案:

答案 0 :(得分:1)

从你的问题我理解,线程1产生状态值,线程2消耗该值,并根据它做一些工作。这里没有锁需要,因为从原始类型读取是线程安全的(当你正在读取数据时,其他线程不会破坏它)。只有当您有两个或更多想要写入数据的写入程序线程时才需要锁定。例如,如果您的线程都要设置Status值,则需要锁定块。

答案 1 :(得分:0)

同步内部属性将无法实现任何目标,因为锁定意味着阻止在使用该资源的代码块中访问共享资源。

需要同步的是访问该属性的整个块。通常,您需要在呼叫者级别同步访问。

void Thread1() {
    lock(myObj) {

        if(myObj.Status)
            Console.WriteLine("Status is true");

        // ...

        // myObj.Status is guaranteed to be still true as long as
        // all the code that accesses the property lock myObj.
        if(myObj.Status)
            Console.WriteLine("Status is still true");

    }
}

请注意,您无需锁定具有该属性的对象。您可以使用另一个对象作为同步机制,只要它在所有相关线程之间共享。

static object mutex = new object();

void Thread1() {
    lock(mutex) {

        if(myObj.Status)
            Console.WriteLine("Status is true");

        // ...

        // myObj.Status is guaranteed to be still true as long as
        // all the code that accesses the property lock myObj.
        if(myObj.Status)
            Console.WriteLine("Status is still true");

    }
}