【问题标题】:C#: Do I have to make ArrayList synchronized if multiple threads only read itC#:如果多个线程只读取它,我是否必须使 ArrayList 同步
【发布时间】:2010-12-21 15:44:05
【问题描述】:

我在一个类中使用静态 ArrayList 来存储有关不可更新的数据库字段的信息。我打算在构造函数中初始化它一次(初始化方法调用由构造函数中的锁保护)。之后,多个线程检查 arraylist 是否包含一个字段。我是否必须以任何方式控制此读取访问权限?例如通过调用 ArrayList.Synchronized。

【问题讨论】:

  • MSDN 是你的朋友:“一个 ArrayList 可以同时支持多个阅读器,只要不修改集合即可。”

标签: c# multithreading arraylist synchronized


【解决方案1】:

不(并且你不应该在创建它时需要,只要你在 static 构造函数中创建它,which has an implicit multithread lock - 如果你不能这样做,你可能会想要锁定) .如果您最终需要进行 R/W 访问,则可以使用 ReaderWriterLockSlim 来控制访问。

【讨论】:

  • "...并且您在创建它时也不应该需要..." - 不正确,如果创建它涉及多个机器语言指令周期,并且可能受到多个线程的影响,那么您确实需要同步对它的访问。这是典型的只读单例困境——
  • @Charles:好点子,已经把它压低了一点(通过说它必须在静态构造函数中)
  • @Ruben,righto,静态 ctor 是解决问题的方法...删除了我的 DV...
  • @Charles:很酷-谢谢。不过,尽管将人们拉到无人看管的 cmets 上,但这是个好主意。我看到 +1 了吗?
  • 谢谢大家。之前是在没有锁的静态构造函数中,但我不确定这是否是正确的方法。
【解决方案2】:

对于 List 的初始创建,您可以考虑使用静态构造函数。这只会在第一次引用该类型时调用一次。

【讨论】:

    【解决方案3】:

    不,但考虑将其包装在 ReadOnlyCollection 中以确保没有线程可以修改它。

    编辑:但是,要做到这一点,您需要将列表设为 List<T> 而不是 ArrayList

    【讨论】:

      【解决方案4】:

      不,只要你在阅读,你就可以拥有它。

      【讨论】:

      • 非常感谢您的快速答复!认为这里的关键字是“否”,否则我并没有完全得到答案。很高兴我不必控制访问,因为应用程序对时间非常关键。
      【解决方案5】:

      没有。只有您要更改状态的有状态对象才需要同步。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-01-29
        • 1970-01-01
        • 1970-01-01
        • 2013-02-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多