如果我写这样的课:
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字段可以告诉线程这个锁是否仍然有效,或者它应该被垃圾收集。
答案 0 :(得分:1)
请阅读this article。
不鼓励使用这种锁定,通常你应该定义一个简单的对象varibale,如
private static readonly object _lock;
使用这种锁对象,您可以在类的实例之间进行同步(因为它是静态的并且在所有实例之间共享)并且没有人可以更改其值(因为它是只读的)并且没有人可以对它使用锁定来自课外,让事情出错(因为它是私人的)
如果你想让对象线程安全(不是所有实例化的对象),你可以删除静态,只需使用尽可能多的私有对象。
根据您的评论进行更新
你可以定义一个这样的类
public class LockWrapper<T>
{
public T InsideClass { get; set; }
public readonly object _lock;
}
然后在需要某个类的多个实例并希望单独锁定它们时使用它