2009-10-22 139 views
0

我的问题的快速版本:.NET多线程同步

是否只有在访问同一个对象实例时需要使用“锁定”?例如,如果我在我的线程入口方法中实例化新的所有东西,我是否必须担心锁定任何对象?

详细我的问题的说明:

我的情况是,我有一个唯一的标识符工作对象,而且工作对象中有1种方法。在该方法中,我创建了多个Web服务代理的新实例,并将从这些调用中检索到的信息存储在工作对象的公共属性中。一旦所有工作完成(所有线程都完成),我将信息存储到数据库中。

任何理由考虑使用“锁”?

回答

1

您只需要在不应同时运行的一段或多段代码上使用lock。例如,如果您的代码在多个线程上使用相同的List<T>,则需要使用锁定。

对于你的情况,如果你有一个单独的工作对象每个线程,如果他们不与任何其他工作对象交互或访问任何共享状态,你应该没问题。

对于一个更具体的答案,请发布更多的细节,或者,最好是来源。


编辑:在回答你的评论,它取决于InvokeService实施。只要它不访问任何其他静态成员,你可能会运行良好,没有任何锁。

0

你说得很对 - 你不需要锁定不在线程间访问的对象。

但是,请注意,没有全局资源(即I/O流),它们在没有同步的情况下被多个线程访问。

+0

关于I/O流,我可能会最接近的是,我的线程入口方法也访问网站来解析数据。我正在创建一个'StreamReader'来分析HttpWebResponse对象的值。 – Benny 2009-10-22 02:25:23

0

如果您正在从多个线程访问静态字段或属性,则只需使用lock关键字。

+0

为了明确,只有在访问静态字段和属性时才使用锁定。静态方法不需要它吗? – Benny 2009-10-22 02:36:08

+0

这取决于静态方法的作用。 – SLaks 2009-10-22 02:44:58

+0

静态与它无关(尽管它是“线程恶意代码”的常见原因)。对同一对象的引用也可能以其他方式结束于不同的线程中(例如,由多个线程执行的可运行类中的字段) – 2009-10-22 03:11:42