【问题标题】:Do we need to lock when we get the property in C#我们在C#中获取属性时是否需要锁定
【发布时间】:2011-08-16 22:39:23
【问题描述】:

在 C# 中,获取非易失性属性时是否需要锁定?我知道我们在设置属性时需要锁定。怎么样?

现在 3.0 提供了自动属性,它本身是线程安全的吗?

【问题讨论】:

标签: c# .net properties thread-safety automatic-properties


【解决方案1】:

不,automatic properties 不是线程安全的。它们只不过是语法糖;编译器会自动生成私有支持字段,就像您手动编写它们一样。

但是,除非您的应用程序从多个线程访问属性,否则首先没有理由担心这一点。从您的问题中很难判断您的应用是否是多线程的。

【讨论】:

  • 我认为自动属性始终是线程安全的,因为它只是返回语句。 (如果 propertyt 类型是一个结构,我不太确定......)。但是,我认为您必须小心,因为您从属性返回的内容绝不会以任何方式防止并发。
  • @Mario:自动属性不是“仅返回语句”。它们还包括一个 setter,由于显而易见的原因,它不是线程安全的。但即使是 getter 也不是必然线程安全的。
  • 好的,取决于数据类型,虽然可以原子操作的所有内容都是线程安全的(所以现在只有像双精度数或浮点数这样的怪物出现在我的脑海中) - 再次我还没有编造我的介意结构...
【解决方案2】:

是的。如果多个线程正在读取/写入同一个属性,则必须锁定它。

自动属性只不过是语法糖,不会锁定。

【讨论】:

    【解决方案3】:

    没有。如果您从多个线程访问该属性,您仍然需要锁定。

    【讨论】:

      【解决方案4】:

      我会说这取决于房产的类型。如果它可以被原子读取(如 int 或指针),则读取是安全的。

      但是,如果您通过属性访问一个对象,那么多个线程可以同时访问该对象。

      但是在 getter/setter 中的锁也无济于事。

      马里奥

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-02-23
        • 1970-01-01
        • 2023-04-05
        • 1970-01-01
        • 1970-01-01
        • 2021-05-06
        • 1970-01-01
        相关资源
        最近更新 更多