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

paI*_*ase 4 c#

public ArrayList InputBuffer
{
    get { lock (this.in_buffer) { return this.in_buffer; } }
}
Run Code Online (Sandbox Code Playgroud)

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

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

Jon*_*eet 5

不,该属性在获取该引用时锁定引用.毫无意义,说实话......这种情况比较常见:

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

public Foo Foo
{
    get
    {
        lock(mutex)
        {
            return foo;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

该锁只会覆盖属性访问本身,并且不会为使用该操作执行的操作提供任何保护Foo.但是,它与根本没有锁定是一样的,因为只要变量只是在持有同一个锁的情况下写入,它确保无论何时读取Foo属性,您都可以访问该属性的最新值. ......没有锁定,没有记忆障碍,你可能会得到一个"陈旧"的结果.

这非常弱,但值得了解.

我个人尽量让极少数类型的线程安全的,而这些往往有更多合适的操作......但如果你想要写的代码,修改和读取多线程性能,这是这样做的一种方式.使用volatile也可以帮助,但它的语义是非常微妙的.

  • 请注意,这并不能真正保护任何东西.foo可以在其他地方更改,而foo本身不会被锁定.引用是字大小的,因此无论如何都是原子访问的.这就是为什么ISyncRoot的东西在1.1之后就消失了,因为通常你需要锁定更广泛的操作级别. (3认同)