【发布时间】:2013-09-25 08:22:26
【问题描述】:
我的问题可能听起来像这里的许多其他问题,但它有一种我没有找到的味道。
我试图理解以下逻辑
一个通用对象
public class GenericClass
{
public static void DoSomething(Object lockObj)
{
lock(lockObj)
{
// do something here
}
}
}
A类
internal class A
{
private static _aLock = new Object();
public void Do_A_Thing()
{
GenericClass.DoSomething(_aLock);
}
}
B类
internal class B
{
private static _bLock = new Object();
public void Do_B_Thing()
{
GenericClass.DoSomething(_bLock);
}
}
我只是希望确认我的解释是否正确:
如果“A”类的多个线程将尝试同时访问“genericClass”方法“DoSomething”中的代码,则该方法将被锁定到除一个“A”类实例之外的所有实例。但是“B”类的单个实例将能够随时继续执行。如果“B”类也将执行多个实例,则它们不会干扰“A”类锁。
根据您在上面看到的情况,这是正确的吗?
【问题讨论】:
-
是的...虽然结构看起来有点吓人
-
lock(lockObj);的末尾真的有;吗?你不应该。这就像拥有if (someCondition); { // do stuff }:您只是将lock或if应用于;指示的空语句,而不是{ }指示的代码块。 -
通常你希望你的锁定对象是私有的,这样你就知道没有其他人可以锁定它们。传递它们需要调用者的大量信任(和知识)。
-
@Tim S.,这里的语法并不重要。认为这是一个伪代码
-
@Niall Connaughton:我的锁对象是
private。他们也是static。因为我希望相同类型的实例“玩得很好”。但同时,让不同类型的实例在它们自己之间播放。代码是伪代码。真实的GenericClass.DoSomething(_aLock)将更像GenericClass.DoSomething(key, data, _aLock);。每种不同的类型都有它的键 :o))