【发布时间】:2009-03-21 09:52:53
【问题描述】:
考虑涉及多个线程写入共享数据结构的代码。现在,这些线程中的每一个都将对象写入共享容器,这些对象本质上是唯一的。举一个(虚构的)例子:
class Logger
{
IDictionary<string, Log> logDictionary = new Dictionary<string, Log>();
// Method called by several other threads
void AddLog(Log log)
{
logDictionary[log.ID] = log;
}
// Method called by a separate thread
IList GetLog(/*some criteria*/)
{
// loop through logDictionary and
// create an IList based on criteria
}
}
我清楚地知道,如果多个线程尝试更新相同的“变量”(或槽)导致竞争条件,对共享对象的并发访问可能会成为问题。现在我的问题有 3 个部分。
(1) 如果线程进行盲更新,是否需要同步? (即使他们正在更新相同的插槽/变量)?
(2) 假设每个线程都在写一个唯一的对象,假设它是线程安全的,就不需要同步对共享字典/容器的访问吗?
(3) 另一个线程调用 GetLog() 是否真的会造成问题,即使字典正在被其他线程同时更新?
【问题讨论】:
标签: c# java multithreading concurrency