锁定对象并更改其字段。它有用吗?

时间:2014-11-03 06:36:28

标签: c# .net multithreading

如果我写这样的课:

public class LockBool
{
    public bool validity = true;
}

然后我锁定这样的对象并更改其validity字段:

LockBool lockObj = GetTheLockObject();
lock(lockObj)
{
    //release some resources
    lockObj.validity = false;
}

因此,如果另一个线程锁定在同一个对象上,它可以读取validity进行流控制。

lock(lockObj)
{
    if(!validity)
        return;
    //do something here
}

它是否按预期工作,没有抛出异常?

(如果它有效,但这是不好的做法,我也想知道细节。谢谢!)

P.S。:我试图使用带有bool字段的类型的原因是创建可变数量的锁定对象。在我释放资源后,似乎很难阻止其他线程获取锁定。所以bool字段可以告诉线程这个锁是否仍然有效,或者它应该被垃圾收集。

1 个答案:

答案 0 :(得分:1)

请阅读this article

不鼓励使用这种锁定,通常你应该定义一个简单的对象varibale,如

private static readonly object _lock;

使用这种锁对象,您可以在类的实例之间进行同步(因为它是静态的并且在所有实例之间共享)并且没有人可以更改其值(因为它是只读的)并且没有人可以对它使用锁定来自课外,让事情出错(因为它是私人的)

如果你想让对象线程安全(不是所有实例化的对象),你可以删除静态,只需使用尽可能多的私有对象。

根据您的评论进行更新

你可以定义一个这样的类

public class LockWrapper<T>
{
    public T InsideClass { get; set; }
    public readonly object _lock;
}

然后在需要某个类的多个实例并希望单独锁定它们时使用它