我有一个从多个线程调用的方法。每个线程都有自己的类实例。同步访问代码的最简单方法是什么?
我不能只使用lock(obj)
其中obj
是实例成员,但仅仅将obj
声明为类的静态就足够了吗?所以对该方法的所有调用都将锁定在同一个对象上?一个简单的例子如下:
class Foo
{
static object locker = new object();
public void Method()
{
lock(locker)
{
//do work
}
}
}
编辑://do work
位正在写入数据库。为什么我需要序列化写入需要3个页面来解释这个特定的实例,我真的不想重温所有引导我到这一点的细节。我所要做的就是确保每个记录在写完下一个记录之前完成了写作。
答案 0 :(得分:8)
当每个线程都有自己的实例时,为什么需要任何同步?保护共享的资源,不要担心非共享状态。这会自动帮助您找到锁定对象的最佳位置。如果它是对象共有的静态成员,那么你确实也需要一个静态锁定对象。
答案 1 :(得分:1)
您的示例肯定会有效,但必须有一些资源在类的不同实例之间共享以实现必要。
答案 2 :(得分:1)
您遗漏了最重要的部分:// do work
如果// do work
使用静态数据,那么您就拥有了正确的解决方案。
如果// do work
仅使用实例数据,那么您可以完全省略lock() {}
(因为1个实例属于1个线程)或使用非静态locker
(1个实例,多个线程)。