假设我有一个对象数组:
MyObject[] objects = new MyObject[10];
然后我循环遍历数组,并锁定每个对象以便按数组索引进行处理:
for (int i=0; i<10; i++)
{
lock (objects[i])
{
// process objects[i]
}
}
这是否意味着对象本身已被锁定?或者参考对象[i]被锁定了?是否会阻止从通过此数组以外的其他地方调用同一对象?
答案 0 :(得分:1)
锁机制与对象相关联,而不是与引用相关联,而不与变量相关联。
所以是的,在其他地方锁定同一个对象实例,在另一个线程上将阻塞其他地方,直到你在示例代码中退出锁。
请注意,不使用lock
或Monitor.Enter
的其他线程上的代码将不被阻止。
另外,请注意锁定语句块内的异常将退出该块并释放锁定,可能会将您锁定的任何内容保留在损坏的状态。