C#线程安全对象池实现
时间: 2024-02-05 18:08:50 浏览: 185
以下是一个C#线程安全对象池的实现示例:
```csharp
using System;
using System.Collections.Concurrent;
public class ObjectPool<T>
{
private readonly Func<T> _objectFactory;
private readonly ConcurrentBag<T> _objects;
private readonly int _maxObjects;
public ObjectPool(Func<T> objectFactory, int maxObjects)
{
_objectFactory = objectFactory;
_objects = new ConcurrentBag<T>();
_maxObjects = maxObjects;
}
public T GetObject()
{
T obj;
if (_objects.TryTake(out obj))
{
return obj;
}
return _objectFactory();
}
public void PutObject(T obj)
{
if (_objects.Count < _maxObjects)
{
_objects.Add(obj);
}
else
{
// 如果对象池已满,则不放回对象池,直接释放对象
// 或者可以选择其他处理方式,比如抛出异常
// 这里只是一个简单的示例
DisposeObject(obj);
}
}
private void DisposeObject(T obj)
{
if (obj is IDisposable disposable)
{
disposable.Dispose();
}
}
}
```
这个对象池类使用了`ConcurrentBag`来实现线程安全的对象管理。在创建`ObjectPool`对象时,需要传入一个用于创建对象的委托函数和一个最大对象数的限制。当需要获取对象时,先尝试从对象池中获取一个可用的对象,如果对象池中没有可用的对象,则根据委托函数创建一个新的对象。使用完毕后,将对象放回对象池中。如果对象池已满,则不放回对象池,直接释放对象。
阅读全文