锁定每个属性

时间:2017-05-09 18:02:31

标签: c# locking

我正在查看一些我不理解其中的代码。

private object myProperty_lock = new Object();
private SomeType myProperty_backing;

public SomeType MyProperty
{
    get { lock(myProperty_lock) { return myProperty_backing; } }
    set { lock(myProperty_lock) { myProperty_backing = value; } }
}
  • 此模式在同一个类中多次使用。
  • 每次使用此模式时,都会有一个新的锁定对象。 (它不是所有属性的共享锁对象。)
  • 使用的类型是引用类型和基元。 (没有非原始结构。)

此代码是否 ?参考文献&原语是以原子方式分配的,因此我们不需要在分配过程中防止线程切换。锁定对象在其他任何地方都没有使用,所以那里没有保护。

或许存在内存障碍吗?我曾假设方法中的锁定不会影响该方法之外的事物。

2 个答案:

答案 0 :(得分:0)

代码在方法中的事实并不意味着内存障碍。因此,您可能正在怀疑锁定是为了新的读取内存保证。

当然它也可以添加,因为添加它的人是cargo cult programmer,并且不明白为什么要这样做而且只是因为他看到了一个代码示例来做它。

答案 1 :(得分:0)

我在这里看到的问题是,通过使用lock,开发人员表示对线程安全的担忧。他们认为并发线程可能正在访问此属性。

我的第一个问题是,实际情况是否存在 - 是否可以同时访问此属性?

可能有一个有效的场景,但是有没有理由为什么任意数量的线程都可以设置该引用?如果一个线程设置属性(可能是出于某种正当理由),只是让它立即被另一个线程覆盖,那么会发生什么样的逻辑呢?应用程序如何做出可预测的事情?前一个调用者设置的引用是否无关紧要?那为什么要设置属性?

那个对象 - SomeType - 从属性返回了什么?现在任意数量的线程都可以引用同一个实例。可以更改SomeType,如果可以,它是否可以线程安全?

我通常不会怀疑,但是当我看到多线程看起来很奇怪的东西时,我喜欢深入挖掘一下。也许他们把它们拼凑在一起并且有效,但有时他们没有。