D .Stark Asked:2020-06-24 17:11:58 +0000 UTC2020-06-24 17:11:58 +0000 UTC 2020-06-24 17:11:58 +0000 UTC 什么时候使用 volatile 更好? 772 假设我有一个List<T>,它同时读取一个流,另一个写入它。在这种情况下,使用 volatile 还是 ConcurrentBag 会更正确、更快速? c# 1 个回答 Voted Best Answer VladD 2020-06-26T22:26:08Z2020-06-26T22:26:08Z 只有当您实现了功能时,您才能谈论速度,并且分析表明数据访问是一个瓶颈。那么让我们来看看正确性。 让我们从volatile不能应用于列表的事实开始——volatile字段只能是基本类型。即使可以使用,同步对容器引用的访问又有什么意义呢?我们根据容器内的数据进行比赛。 ConcurrentBag是更明智的选择。但这仅当数据实际上只添加到其中一个线程中,而不被它修改时。根据您的具体任务,您可能需要ConcurrentBag(如果顺序不重要)或ConcurrentQueue(如果重要)。 如果您需要通过索引访问,或者在写入线程中修改数据(例如:)collection[i]++,您不应该在几微秒内寻找好处,使用 normal 更容易和更安全lock。
只有当您实现了功能时,您才能谈论速度,并且分析表明数据访问是一个瓶颈。那么让我们来看看正确性。
让我们从
volatile不能应用于列表的事实开始——volatile字段只能是基本类型。即使可以使用,同步对容器引用的访问又有什么意义呢?我们根据容器内的数据进行比赛。ConcurrentBag是更明智的选择。但这仅当数据实际上只添加到其中一个线程中,而不被它修改时。根据您的具体任务,您可能需要ConcurrentBag(如果顺序不重要)或ConcurrentQueue(如果重要)。如果您需要通过索引访问,或者在写入线程中修改数据(例如:)
collection[i]++,您不应该在几微秒内寻找好处,使用 normal 更容易和更安全lock。