我有多个线程都需要写入同一个字典。 为了确保只有1个线程一次更新字典,我维护一个对象的锁。 我的问题如下。如果一个线程尝试更新字典,而另一个线程有锁,线程是否会知道要等待?它会失败吗?如果线程只是等待,我可以避免太多人等待,有没有办法说最多五个队员可以排队,其余的只是继续?dotNet中的锁定和多线程
0
A
回答
1
如果一个线程持有一个锁,而另一个线程试图获取同一个锁,则第二个线程将等待。
线程是否只写,或者你有读操作?如果是这种情况,你应该使用ReaderWriterLockSlim
(除非你已经这样做)。这将允许您有多个线程并行读取,除非线程正在更新,在这种情况下,它可以独占访问资源。
0
lock(obj)语句将阻止任何其他线程访问共享资源,直到该线程完成。
0
锁本身不保护对象。锁可以防止其他线程获取相同的锁。因此,如果锁被设计为保护资源(如字典),则其他线程必须在访问资源(字典)之前合作并获取相同的锁。如果一个线程忽略了这一点,并且访问的资源不是那么少,那么它可能会遇到字典中的无效状态,瞬态状态,并因此导致各种错误。这适用于读取和写入操作。 .Net中的集合类带有一个名为SyncRoot的属性,如果多个线程访问被拒绝,则该属性通常是所有线程使用的推荐对象。正如弗雷德里克已经指出的,有专门的ReaderWriter类型,允许多个,共享,读取和一个,独占,写。比较复杂的方案,比如你引用的方案(如果太多线程正在等待资源,就避免操作)很难以完全安全和正确的方式进行编码,所以最好避免这种复杂情况并坚持基本原语。
相关问题
- 1. 锁定多个线程
- 2. 多线程中的死锁
- 3. C#线程和锁定
- 4. 在多线程中锁定对象
- 5. Python线程和锁定:死锁
- 6. 线程和锁定在我的程序
- 7. 线程和锁
- 8. 锁定在多个线程的变量
- 9. 多线程中的类锁和对象锁
- 10. 多线程程序中的锁()
- 11. 在C中锁定线程#
- 12. 线程锁定CollectionViewSource
- 13. 3线程锁定
- 14. 多线程锁定Java Swing GUI
- 15. ç窗口多线程文件锁定
- 16. 无法锁定简单多线程程序中的错误
- 17. 多线程以及多进程的Java文件锁定方式
- 18. 多线程与锁vs单线程?
- 19. Java锁和解锁不同的线程
- 20. Android线程和数据库锁定
- 21. 使用休眠和线程锁定
- 22. c线程和资源锁定
- 23. 线程并发 - 同步和锁定。
- 24. Java多线程 - 检测自动锁定线程
- 25. 多线程自旋锁?
- 26. 多线程锁测试
- 27. 多线程,通用锁具
- 28. 多线程DLL和锁从第二个线程调用函数
- 29. 如何锁定Javascript中的线程?
- 30. Android锁定线程中的CountDownLatch