如何将多线程调用同步到同一方法

时间:2010-09-14 20:12:50

标签: c# multithreading

我有一个从多个线程调用的方法。每个线程都有自己的类实例。同步访问代码的最简单方法是什么?

我不能只使用lock(obj)其中obj是实例成员,但仅仅将obj声明为类的静态就足够了吗?所以对该方法的所有调用都将锁定在同一个对象上?一个简单的例子如下:

class Foo
{
    static object locker = new object();

    public void Method()
    {
        lock(locker)
        {
            //do work
        }
    }
}

编辑://do work位正在写入数据库。为什么我需要序列化写入需要3个页面来解释这个特定的实例,我真的不想重温所有引导我到这一点的细节。我所要做的就是确保每个记录在写完下一个记录之前完成了写作。

3 个答案:

答案 0 :(得分:8)

当每个线程都有自己的实例时,为什么需要任何同步?保护共享的资源,不要担心非共享状态。这会自动帮助您找到锁定对象的最佳位置。如果它是对象共有的静态成员,那么你确实也需要一个静态锁定对象。

答案 1 :(得分:1)

您的示例肯定会有效,但必须有一些资源在类的不同实例之间共享以实现必要。

答案 2 :(得分:1)

您遗漏了最重要的部分:// do work

中包含哪些数据

如果// do work使用静态数据,那么您就拥有了正确的解决方案。

如果// do work仅使用实例数据,那么您可以完全省略lock() {}(因为1个实例属于1个线程)或使用非静态locker(1个实例,多个线程)。