c#基元数组是否易变?

c#基元数组是否易变?,c#,C#,我这样声明数组private double[]array=new double[length]。在一个线程中更新此数组项并在另一个线程中读取是否安全?我会有最新的价值吗 注意我不枚举数组。我仅通过索引访问其项。数组不是线程安全的,来自: 通过集合枚举本质上不是线程安全的 程序即使在同步集合时,其他线程也可以 仍然修改集合,这会导致枚举数抛出 例外。要保证枚举期间的线程安全,可以 在整个枚举过程中锁定集合或捕获 由其他线程所做的更改导致的异常 如果您一次只更新单个项目,我认为您是安全的,但我不会相

我这样声明数组
private double[]array=new double[length]
。在一个线程中更新此数组项并在另一个线程中读取是否安全?我会有最新的价值吗


注意我不枚举数组。我仅通过索引访问其项。

数组不是线程安全的,来自:

通过集合枚举本质上不是线程安全的 程序即使在同步集合时,其他线程也可以 仍然修改集合,这会导致枚举数抛出 例外。要保证枚举期间的线程安全,可以 在整个枚举过程中锁定集合或捕获 由其他线程所做的更改导致的异常


如果您一次只更新单个项目,我认为您是安全的,但我不会相信它,除非我找到证明它的文档。

Volatile不能保证值的新鲜度。它阻止了一些优化,但不能保证线程同步


不保证是双倍的。因此,在没有同步的情况下更新/读取double数组,无论是使用wit还是volatile,都不会是线程安全的,因为您可能会读取部分写入的值。

不,它们不是。您应该使用信号量或其他方法来设计锁定系统,以确保线程安全。您可以检查。

我不修改数组。我只修改数组中的项。我知道数组不是线程安全的。问题是-数组项是否易变?请参阅我的答案-写入双精度不是原子的,因此易变性对您没有帮助(据我所知,数组项不被视为易变的,也不能成为一个-)。
因为您可能会读到部分写入的值。我在想原始赋值是原子运算。。。在这个类中还有一些更复杂的原子操作,通常当你说“update”
operator=
是假定的。如果你使用适当的联锁,它将是原子的。
double
的非原子更新是回答这个问题的关键-我认为这应该是公认的答案。Interlocked实际上在数组元素上工作(我刚刚测试过,没想到它会工作)。如何执行double的原子更新?我应该使用哪种
联锁
方法?这能保证新鲜吗?也就是说,
联锁
方法会比volatile方法“更难”吗?将以原子方式更新双原子
联锁.Exchange(参考arr[3],myValue)