与多线程并发操作Queue有关!
1)如果你用的是System.Collection.Queue集合,插入队列时
|
1
2
3
4
5
6
|
System.Collection.Queue q = new System.Collection.Queue();//锁定队列集合,然后插入lock (q.SyncRoot){ q.Enqueue(……);} |
2)如果你用的是System.Collections.Generic.Queue<T>
|
1
2
3
4
5
6
|
object synObj = new object();System.Collections.Generic.Queue<int> q = System.Collections.Generic.Queue<int>();lock(syncObj){ q.Enqueue(……);} |
追问
不知道这里第二段代码中为何需要对于这个object进行lock而不是对q进行lock?
回答
lock(obj){…}后面两个大括号直接的代码称为临界区。当一个线程执行位于代码的临界区时,另一个线程会阻止在临界区外,不会进入该临界区,一直到该lock(obj)锁定的象obj被释放。
第二代码片段中,当然可以这样写
lock(q)
{ }
用q(队列)作为lock的锁定对象。但这样做有个缺点:一旦q被lock锁定,其他对q进行只读操作的线程也无法存取这个q了。
使用了最简单对象object synObj = new object()做为lock锁定对象,这样,在多线程环境中:允许一个线程对队列进行修改;同时允许其他线程读取队列。
本文详细介绍了使用System.Collection.Queue和System.Collections.Generic.Queue<T>集合进行队列操作时,如何在多线程环境下通过锁机制确保数据的一致性和安全性。特别解释了为何在第二种情况下选择使用object作为锁对象,以及这种选择带来的好处和潜在的缺点。

被折叠的 条评论
为什么被折叠?



