gpt4 book ai didi

c# - 为什么锁对象必须是只读的?

转载 作者:IT王子 更新时间:2023-10-29 04:22:29 26 4
gpt4 key购买 nike

在实现锁时,我曾经在我的类中创建一个私有(private)对象:

如果我想确定它被锁定在创建我的类的线程中:

private object Locker = new object();

如果我想确保它会为我的应用程序中的所有线程锁定:

private static object Locker = new object();

但是在这里: Why does the lock object have to be static?

在许多其他问题中,每个人都说对象必须是readonly。我还没有找到原因 - 甚至在 MSDN 或 JavaDoc 中也没有。

因为我经常使用这种结构,有人可以向我解释为什么我应该使用readonly吗?

谢谢!

最佳答案

If I want to be sure that it will be locked for all threads inside my application:

锁对象必须是静态的,如果它锁定对静态状态的访问。
否则它必须是实例,因为不需要锁定一个类实例的状态,并防止其他线程同时与另一个类实例一起工作。

everyone says that the object has to be "readonly" I didn't found the reason

好吧,这不是必须的。这只是一种最佳做法,可帮助您避免错误。

考虑这段代码:

class MyClass
{
private object myLock = new object();
private int state;

public void Method1()
{
lock (myLock)
{
state = // ...
}
}

public void Method2()
{
myLock = new object();
lock (myLock)
{
state = // ...
}
}
}

这里Thread1可以通过Method1获取锁,但是要执行Method2的Thread2会忽略这个锁,因为锁对象被改变=>状态可以被损坏。

关于c# - 为什么锁对象必须是只读的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22063191/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com