在这个锁中存在一个问题,但我无法理解这是什么。我强烈怀疑下面的例子没有足够的锁定。那有什么问题呢?
class example
{
object locker = new object();
void start()
{
for (int i = 0; i < 1000; i++)
{
(new Thread(dostuff)).Start();
}
}
void dostuff()
{
lock (locker)
{
//dosomething
}
}
}
答案 0 :(得分:4)
看起来你正在旋转1000个线程,然后锁定每个线程。这意味着dostuff中的代码(位于锁定部分中)将按顺序而不是同时执行。
如上所述,直接在for循环中调用dostuff()会更有效。
答案 1 :(得分:3)
您的代码创建了1000个主题。这非常昂贵,需要超过1 GB的内存。
然后所有这些线程争夺单个锁,基本上是序列化(解线程)整个操作。
但你的锁工作正常,没有错。只是当你运行这个应用程序时,它可能看起来像你的PC崩溃了。
另请注意,您要保护的对象应与锁定器对象1对1绑定。
但是为了获得更好的答案,你必须发布一些更完整的代码,可能更接近真实的代码。
答案 2 :(得分:2)
我不太确定你在这里做什么,但你的1000个线程将连续运行。首先击败线程的目的。
你的“dostuff”方法立即锁定线程运行的整个长度。然后线程解锁,线上的下一个线程可以开始处理(并锁定...)
答案 3 :(得分:2)
我不确定你的问题是什么 - 这段代码将启动dostuff 1000次,但锁中的代码一次只能执行一次。
锁定的唯一问题是,如果您需要一次只执行一个代码,而不管您创建的示例类的副本数量是多少。如果这很重要,那么您需要使锁定器对象保持静态。