【问题标题】:Multi-threaded Application with Readonly Properties具有只读属性的多线程应用程序
【发布时间】:2010-06-09 17:26:35
【问题描述】:

我的具有只读属性的多线程应用程序是否需要锁定?由于没有写任何东西,我认为不需要锁,但我想确定一下。这个问题的答案是否与语言无关?

无锁:

Private Const m_strFoo as String = "Foo"
Public ReadOnly Property Foo() As String
    Get
        return m_strFoo.copy()
    End Get
End Property

带锁:

Private Const m_strBar as String = "Bar"
Public ReadOnly Property Bar() As String
    Get
        SyncLock (me)
            return m_strBar.copy()
        End Synclock
    End Get
End Property

编辑:向字段添加常量

【问题讨论】:

  • 您的属性可能是只读的,但数据是吗?如果类本身正在改变数据,您可能需要锁。如果数据从不改变,则不需要锁。
  • 我不熟悉你编写的语言,但在我看来,锁定示例永远不会解锁......

标签: multithreading language-agnostic locking


【解决方案1】:

正确设计的immutable objects 通常是线程安全的。风险在于“正确设计”是一个复杂的主题 - 请参阅 Peter Veentjer's 处理以了解 Java 中不可变线程安全缺陷的示例。

【讨论】:

  • 构造函数中的同步应该解决 myInt 的 Peter Veentjer 示例。有趣的文章!
【解决方案2】:

如果字符串成员永远不会改变,您可以放弃锁定。但是,如果您要不时对其进行修改,则公共成员方法将需要同步它对私有成员的访问。

【讨论】:

  • 如果你主要关心的是速度而不是毫秒级的正确性,你也可以放弃读取值的锁定,即使它被其他代码定期更改。例如。当答案是 2,000,000 或 2,000,005 甚至 2,000,500 时,并没有真正的区别。例如日志中较小的数字也是如此。你真的在乎某件事被问了 1309 次还是 1308 次?如果没有,您可以放弃锁定。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-19
  • 1970-01-01
  • 2013-09-16
相关资源
最近更新 更多