c# - 将对象锁定在属性中,c#

标签 c#

public ArrayList InputBuffer
{
    get { lock (this.in_buffer) { return this.in_buffer; } }
}

在调用 InputBuffer.Clear 期间是否锁定了 this.in_buffer?

或者属性在获取对 in_buffer 对象的引用时简单地锁定它;锁退出,然后该引用用于清除?

最佳答案

不,属性在获取引用时锁定引用。老实说,这毫无意义……这更常见:

private readonly object mutex = new object();
private Foo foo = ...;

public Foo Foo
{
    get
    {
        lock(mutex)
        {
            return foo;
        }
    }
}

该锁将覆盖属性访问本身,并且不会为使用Foo 执行的操作提供任何保护。然而,这与完全没有锁是一样的,因为只要变量只是在持有相同锁的情况下写入,它确保任何时候你读取Foo 属性,您正在访问属性的最新值...没有锁,没有内存屏障,您可能会得到“陈旧”的结果。

这很弱,但值得了解。

就我个人而言,我尝试使极少数类型成为线程安全的,而那些往往具有更合适的操作...但是如果您想编写确实从多个线程修改和读取属性的代码,这是这样做的一种方式。使用 volatile 也有帮助,但它的语义非常微妙。

关于c# - 将对象锁定在属性中,c#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5092769/

相关文章:

c# - WCF 测试客户端无法添加服务,无法获取元数据

c# - 在 C# webservice 中使用 NameValueCollection 给出了 not XML serializable 错误

c# - 从类的属性中获取这些 JSON 值的更好方法?

c# - 编译器如何自动计算协变和逆变?

c# - 我应该在哪里创建用户 session ?

C# ObservableCollection 添加报错

c# - MVC 4 动态操作方法参数

c# - 如何将自引用表绑定(bind)到 WPF TreeView

c# - 正则表达式提取括号之间还包含其他括号的字符串

c# - 递归:显示从 a 到 b 的数字,并显示它们的和