2009-06-29 74 views
0

我有多个线程都需要写入同一个字典。 为了确保只有1个线程一次更新字典,我维护一个对象的锁。 我的问题如下。如果一个线程尝试更新字典,而另一个线程有锁,线程是否会知道要等待?它会失败吗?如果线程只是等待,我可以避免太多人等待,有没有办法说最多五个队员可以排队,其余的只是继续?dotNet中的锁定和多线程

回答

1

如果一个线程持有一个锁,而另一个线程试图获取同一个锁,则第二个线程将等待。

线程是否只写,或者你有读操作?如果是这种情况,你应该使用ReaderWriterLockSlim(除非你已经这样做)。这将允许您有多个线程并行读取,除非线程正在更新,在这种情况下,它可以独占访问资源。

0

lock(obj)语句将阻止任何其他线程访问共享资源,直到该线程完成。

0

锁本身不保护对象。锁可以防止其他线程获取相同的锁。因此,如果锁被设计为保护资源(如字典),则其他线程必须在访问资源(字典)之前合作并获取相同的锁。如果一个线程忽略了这一点,并且访问的资源不是那么少,那么它可能会遇到字典中的无效状态,瞬态状态,并因此导致各种错误。这适用于读取和写入操作。 .Net中的集合类带有一个名为SyncRoot的属性,如果多个线程访问被拒绝,则该属性通常是所有线程使用的推荐对象。正如弗雷德里克已经指出的,有专门的ReaderWriter类型,允许多个,共享,读取和一个,独占,写。比较复杂的方案,比如你引用的方案(如果太多线程正在等待资源,就避免操作)很难以完全安全和正确的方式进行编码,所以最好避免这种复杂情况并坚持基本原语。