我有一个有效的字符串值数组,如下所示:
string[] validValues = new string[] {"none","all","some"};
我有一个方法可以在下拉框中验证用户的选择,如下所示:
bool valid = validValues.Contains( selection );
每次调用此方法时,我都不想重新创建validValues
数组,所以我想将它分配给static readonly
属性。数组本身是不可变的。这种情况是否是线程安全的?这是MVC控制器方法的一部分,因此多个线程很可能同时通过Enumerable<string>.Contains
方法访问数组。
如果枚举不是线程安全的,那么使用Array.IndexOf
之类的方法是否可以线程安全?反编译表明该方法调用本机方法TrySZIndexOf,或者通过索引迭代数组。从我读过的here开始,这可能是安全的吗?我只是宁愿使用Contains,因为它传达了比IndexOf() == -1
更清楚地完成的事情。
答案 0 :(得分:2)
是的,这种访问是线程安全的(假设数组永远不会被修改)。
如果标准Dictionary
或HashSet
效果更好,也可以使用标准ImmutableList或Why are immutable objects thread-safe?,因为它们对于只读多线程访问也是安全的。
如果您担心错误地更改数组 - 请考虑使用新的不可变类型,例如immutable data structures。
涵盖共鸣的通用讨论 - Read-only and theradsafe。此外,Eric Lippert撰写了一系列关于的文章,并https://github.com/fpt-software/Material-Controls-For-iOS/触及了此类访问的主题。
答案 1 :(得分:0)
是。当您将其声明为只读时,它是线程安全的。
您可以在C#中使用ReadOnlyCollection类,而不是将数组声明为只读。
https://msdn.microsoft.com/en-us/library/ms132474(v=vs.110).aspx