【发布时间】:2019-01-11 15:12:38
【问题描述】:
鉴于下面的代码
var array = new object[10];
for(int x = 0;x<array.Length;x++)
array[x] = new object();
//Lock on Array
lock(array){
//Do Stuff
}
//Lock on object of array
lock(array[1]){
//Do Stuff
}
//lock on another object
var o = array[1];
lock(o){
//Do Stuff
}
第一个 lock 语句将锁定对象 array。
但是在第二个 lock 语句中,锁定是发生在数组索引 1 处的对象上,还是也发生在对象 array 上?另一种问问题的方式,第二把锁和第三把锁的行为是一样的吗?
【问题讨论】:
-
做第二个锁,然后分别尝试第一个和第三个,看看哪个被阻止,哪个可以被占用。然后你就会知道哪个被锁定了。
-
我认为这真的不值得一个完整的答案,所以在这里作为评论:第二个和第三个锁都锁定在同一个对象上:数组索引 1 处的对象。做什么服务建议。
-
array索引 1 处有一个对象。在您的第三个示例中,您创建了一个附加的 变量 来引用同一个对象,但仍然只有一个对象同时 @ 987654325@ 和array[1]正在引用。 -
你绝对不能,永远不要写这样的代码。它给人一种错误的印象,即数组现在处于一种使其成为线程安全的神奇状态。类似的事情实际上并没有发生。始终声明一个专用变量来存储锁定状态。几个优点,一个是你不必问这个问题。
-
另一个优势(关于@HansPassant 的评论)是,当您创建像
private object _myLock = new object();这样的私有变量时,您的班级之外的任何人都不能弄乱您用作锁的对象。始终为您的锁专用一个私有(非值类型)对象 - 它更安全、更清晰
标签: c# multithreading locking