【问题标题】:Using lock statement to read and save a list?使用 lock 语句读取和保存列表?
【发布时间】:2013-12-21 17:20:44
【问题描述】:

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

如果两个角色想要同一个对象,第一个角色在列表中没有找到它,所以它把它保存在列表中,但就在它这样做之前,第二个角色在列表中查找,没有找到对象, 并再次保存对象:同一个对象将被保存两次。我们如何防止这种情况发生?

【问题讨论】:

  • 我很困惑,您的问题标题似乎表明您已经知道解决方案:使用lock。那么,真正的问题是什么?

标签: c# list thread-safety locking unity3d


【解决方案1】:
lock (list)
{
    if (!FindObject(list))
    {
        MyClass obj = CreateObject();
        list.Add(obj)
    }
}

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

【讨论】:

  • 非常感谢@sysexpand
【解决方案2】:

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

private readonly object _lock = new object();

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

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

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

【讨论】:

  • 非常感谢 Michal 的解释
猜你喜欢
  • 1970-01-01
  • 2021-10-03
  • 1970-01-01
  • 2020-02-04
  • 1970-01-01
  • 1970-01-01
  • 2013-05-22
  • 2011-08-25
  • 1970-01-01
相关资源
最近更新 更多