作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
考虑以下示例:
class Example
{
private readonly List<string> _list = new List<string>();
private readonly object _lock = new object();
public IReadOnlyList<string> Contents
{
get
{
lock (_lock)
{
return new List<string>(_list);
}
}
}
public void ModifyOperation(string example)
{
lock (_lock)
{
// ...
_list.Add(example);
// ...
}
}
}
如何在不复制整个列表的情况下实现对 Contents
列表的并行读取访问?在 C# 中有并发 Collections
,但是没有线程安全的List。在 Java 中有类似于 CopyOnWriteArrayList
的东西。 .
最佳答案
在我看来 ImmutableList<T>
来自 System.Collections.Immutable 的类(class)包非常适合这种情况。它实现了 IReadOnlyList<T>
,并且由于它是不可变的,即从未修改过,您可以直接从读取访问器返回它。唯一需要的同步是在修改操作之间:
class Example
{
private ImmutableList<string> _list = ImmutableList<string>.Empty;
private readonly object _lock = new object();
public IReadOnlyList<string> Contents => _list;
public void ModifyOperation(string example)
{
lock (_lock)
{
// ...
_list = _list.Add(example);
// ...
}
}
}
关于C# 对 List 的并行读取访问而无需复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38848335/
我是一名优秀的程序员,十分优秀!