这个锁有什么问题?

高度存在这个锁的问题,但我无法理解这是什么。 我强烈怀疑下面的例子没有足够的锁定。 那有什么问题呢?

class example { object locker = new object(); void start() { for (int i = 0; i < 1000; i++) { (new Thread(dostuff)).Start(); } } void dostuff() { lock (locker) { //dosomething } } } 

您的代码创建了1000个线程。 这非常昂贵,需要超过1 GB的内存。

然后所有这些线程竞争单个锁,基本上序列化(去线程)整个操作。

但你的工作正常,没有错。 只是当你运行这个应用程序时,它可能看起来像你的PC崩溃。


另请注意,您要保护的对象应与锁定器对象1对1绑定。

但是为了获得更好的答案,你必须发布一些更完整的代码,可能更接近真实的代码。

看起来你正在旋转1000个线程,然后锁定每个线程。 这意味着dostuff中的代码(位于锁定部分中)将按顺序而不是同时执行。

如上所述,直接在for循环中调用dostuff()会更有效。

我不太确定你在这做什么,但你的1000个线程将连续运行。 首先击败线程的目的。

你的“dostuff”方法立即锁定整个线程运行长度。 线程然后解锁,线上的下一个线程可以开始处理(并锁定……)

我不确定你的问题是什么 – 这段代码将启动dostuff 1000次,但锁中的代码一次只执行一次。

锁定的唯一问题是,如果您需要一次只执行一个代码,而不管您创建的示例类的副本数量是多少。 如果这很重要,那么您需要使锁定器对象保持静态。