如果许多线程借用()并将数据包的实例从/返回到PacketPool,那么Packet.Init()中的异常会被抛出吗?假设只有PacketPool调用包上的Init()和UnInit()方法。
class PacketPool
{
private Stack<Packet> pool;
public PacketPool(int initalNum)
{
pool = new Stack<Packet>(initalNum);
for (int i = 0; i < initalNum; i++)
{
Packet p = new Packet();
pool.Push(p);
}
}
public Packet Borrow()
{
Packet p;
lock (pool)
{
if (pool.Count == 0)
{
p = new Packet();
}
else
{
p = pool.Pop();
}
}
p.Init();
return p;
}
public void Return(Packet p)
{
p.UnInit();
lock (pool)
{
pool.Push(p);
}
}
}
class Packet
{
bool isInitialized;
public void Init()
{
if(isInitialized)
throw new InvalidOperationException("Already initialized!");
isInitialized = true;
}
public void UnInit()
{
isInitialized = false;
}
}发布于 2013-08-11 12:33:45
假设只有
PacketPool在Packet上调用了Init()和UnInit()方法。
我觉得这不是你应该做的假设。如果您的代码的用户不应该调用某些方法,那么不要让他这样做,不要仅仅假设他不会。
您可以做的是将不包含这两个方法的外观返回到Packet,而不是直接返回Packet。
发布于 2013-08-11 09:57:16
不,永远不会抛出Packet.Init()中的异常。这是因为尽管the ()中可能有多个线程,但lock语句将确保每个线程都看到自己版本的p。
https://codereview.stackexchange.com/questions/29606
复制相似问题