我實現了一個通用的ObjectPool的類,但經歷過這一段死鎖(發生在Monitor.Wait(poolLock))ObjectPool的實現死鎖
任何人都可以發現這個錯誤嗎?
public class ObjectPool<T> where T : new()
{
private readonly object poolLock = new object();
Stack<T> stack = null;
public ObjectPool(int count)
{
stack = new Stack<T>(count);
for (int i=0; i<count; i++)
stack.Push(new T());
}
public T Get()
{
lock (poolLock)
{
//if no more left wait for one to get Pushed
while (stack.Count < 1)
Monitor.Wait(poolLock);
return stack.Pop();
}
}
public void Put(T item)
{
lock (poolLock)
{
stack.Push(item);
//If adding first send signal
if (stack.Count == 1)
Monitor.Pulse(poolLock);
}
}
使用
try
{
service = myPool.Get();
}
finally
{
if (service != null)
myPool.Put(service);
}
好的拼圖。當它死鎖時,是否與stack.Count == 0? – 2011-02-23 16:05:08
它是Monitor.Wait(poolLock)阻止。 – Stig 2011-02-23 17:06:32