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/