C# 如果两个引用试图在列表中同时添加数据,会发生什么<;T>;集合

C# 如果两个引用试图在列表中同时添加数据,会发生什么<;T>;集合,c#,list,c#-4.0,collections,C#,List,C# 4.0,Collections,检查此功能 private static IEnumerable<string> FindAccessibleDatabases() { var connectionStrings = new List<string>(); Parallel.For(0, _connectionStringCollection.Count, (index, loopState) => { try { u

检查此功能

private static IEnumerable<string> FindAccessibleDatabases()
{
    var connectionStrings = new List<string>();
    Parallel.For(0, _connectionStringCollection.Count, (index, loopState) =>
    {
        try
        {
            using (var connection = new OleDbConnection(_connectionStringCollection[index]))
            {
                connection.Open();
                connectionStrings.Add(_connectionStringCollection[index]);
            }
        }
        catch (OleDbException)
        {
        }
        finally         
        {
           connection.Close();
        }
    });
    return connectionStrings.ToList();
}
私有静态IEnumerable FindAccessibleDatabases()
{
var connectionStrings=新列表();
Parallel.For(0,_connectionStringCollection.Count,(index,loopState)=>
{
尝试
{
使用(var连接=新的OleDbConnection(_connectionStringCollection[index]))
{
connection.Open();
connectionStrings.Add(_connectionStringCollection[index]);
}
}
捕获(OLEDBEException)
{
}
最后
{
connection.Close();
}
});
返回ConnectionString.ToList();
}
我正在使用Parallel.Foreach并一次在多个数据库的列表中添加值。我可以使用ConcurrentBag(在检索数据时是安全的,但没有提到添加),因为我只是将数据添加到列表中,所以可以使用列表

现在,如果两个线程试图同时向列表中添加数据,会发生什么情况

如果它会创造竞争条件,那么如果我使用ConcurrentBag呢

谢谢,
Omkar

您面临着发生未指定的坏事情的风险,如重复、一项未添加、数据结构损坏等

表示
List
的Add方法不是线程安全的(具体来说,它表示:

列表
可以同时支持多个读卡器,只要 未修改集合。无法通过集合进行枚举 本质上不是线程安全过程。在极少数情况下 枚举与一个或多个写访问争用,这是 确保线程安全是在整个过程中锁定集合 枚举。允许多个用户访问集合 对于读写线程,您必须实现自己的线程 同步

)。因此,您需要在其周围使用线程同步或其他形式的线程同步,或者需要切换到线程安全的数据结构,如命名空间中的某些内容


如果使用ConcurrentBag的Add方法,就不必担心锁定问题。数据结构是显式线程安全的。

您有发生未指定的错误的风险,如重复、未添加一项、损坏数据结构等

表示
List
的Add方法不是线程安全的(具体来说,它表示:

列表
可以同时支持多个读卡器,只要 未修改集合。无法通过集合进行枚举 本质上不是线程安全过程。在极少数情况下 枚举与一个或多个写访问争用,这是 确保线程安全是在整个过程中锁定集合 枚举。允许多个用户访问集合 对于读写线程,您必须实现自己的线程 同步

)。因此,您需要在其周围使用线程同步或其他形式的线程同步,或者需要切换到线程安全的数据结构,如命名空间中的某些内容


如果使用ConcurrentBag的Add方法,就不必担心锁定问题。数据结构是显式线程安全的。

它被称为“竞争条件”。不要这样做。如果我俩尝试检索,我可以理解,但在添加时也会发生吗?答案确实非常具体,它是什么类型的列表实现。不明白这怎么可能是C#和Java。@Affe同意,这显然是C#。在Java中,
ArrayList
的答案恰好相同,但这是一个实现细节,称为“竞争条件”。不要这样做。如果我俩尝试检索,我可以理解,但在添加时也会发生吗?答案确实非常具体,它是什么类型的列表实现。不明白这怎么可能是C#和Java。@Affe同意,这显然是C#。对于
ArrayList
,Java中的答案恰好相同,但这是一个实现细节。在相同的场景中,如果我使用线程安全的数据结构,会发生这种情况吗?1.锁定列表2。添加了第一项。。。同时,将第二项放入队列3。解锁列表4。退出队列的第二项线程安全数据结构在读写时不需要锁。如果您对System.Collections.Concurrent如何工作有疑问,我建议您单独提问或修改您的问题。在相同的情况下,如果我使用线程安全数据结构,会发生这种情况吗?1.锁定列表2。添加了第一项。。。同时,将第二项放入队列3。解锁列表4。退出队列的第二项线程安全数据结构在读写时不需要锁。如果您对System.Collections.Concurrent如何工作有疑问,我建议您单独提问或修改您的问题。