使用lock语句读取和保存列表?

时间:2013-12-21 17:20:44

标签: c# list thread-safety locking unity3d

我在c#中有一个List(在Unity中),我从这个列表中读取了一些数据,如果有我想要的数据的对象不在列表中,我创建对象并保存它。

如果两个字符想要相同的对象,第一个字符在列表中找不到它,所以它将它保存在列表中,但就在它之前,第二个字符在列表中查找,没有找到对象,并再次保存对象:相同的对象将被保存两次。我们怎么能阻止这个?

2 个答案:

答案 0 :(得分:2)

lock (list)
{
    if (!FindObject(list))
    {
        MyClass obj = CreateObject();
        list.Add(obj)
    }
}

此代码确保搜索列表并向其添加新元素是一个原子操作。其他线程必须等待此操作完成才能开始搜索。

答案 1 :(得分:1)

使用 lock 语句是可能的解决方案之一。以下是如何执行此操作的示例:

private readonly object _lock = new object();

lock (_lock)
{
    if(!list.Contains(obj))
        list.Add(obj);
}

请注意,我使用了带有 lock 关键字的私有对象。

您还可以考虑使用 System.Collections.Concurrent 命名空间。它可能并不明显,但 ConcurrentDictionary 支持您的方案。方法 TryAdd 只有在字典中不存在元素时才会添加元素。当然,字典与列表不同,但也许适合你。