线程安全工厂模式
Threadsafe factory pattern
我正在编写一些简单的图形管理器,我决定使用工厂模式为我的图形创建边。我刚刚开始学习设计模式和线程。
我用 return 一些对象(边)创建了工厂,创建方法,代码:
public Edge<T> CreateEdge(Vertex<T> firstVertex, Vertex<T> secondVertex)
{
var edge = new Edge<T>(firstVertex, secondVertex, _nextIndex);
_nextIndex++;
return edge;
}
这是我的问题。如果该工厂将被多个线程共享,那么 return 多个具有相同索引的边缘是可能的。
这个问题的最佳解决方案是什么?
我应该使用锁还是一些互斥锁?
还是我设计不好类,使用factory?
编辑 #1:
更改 IncreaseIndex() -> _nextIndex++;写的时候出错了。
您可以使用:
long _index;
var nextIndex = Interlocked.Increment(ref _index);
这将确保您的索引在线程中保持唯一。在这里使用简单字段最有意义,因为它是边缘工厂 class.
的 属性
另一种方法是将 IncreaseIndex 功能封装在锁中,或者您可以将索引的管理传递给单例 (Jon Skeet's Singleton implementation)。
我正在编写一些简单的图形管理器,我决定使用工厂模式为我的图形创建边。我刚刚开始学习设计模式和线程。
我用 return 一些对象(边)创建了工厂,创建方法,代码:
public Edge<T> CreateEdge(Vertex<T> firstVertex, Vertex<T> secondVertex)
{
var edge = new Edge<T>(firstVertex, secondVertex, _nextIndex);
_nextIndex++;
return edge;
}
这是我的问题。如果该工厂将被多个线程共享,那么 return 多个具有相同索引的边缘是可能的。
这个问题的最佳解决方案是什么?
我应该使用锁还是一些互斥锁?
还是我设计不好类,使用factory?
编辑 #1: 更改 IncreaseIndex() -> _nextIndex++;写的时候出错了。
您可以使用:
long _index;
var nextIndex = Interlocked.Increment(ref _index);
这将确保您的索引在线程中保持唯一。在这里使用简单字段最有意义,因为它是边缘工厂 class.
的 属性另一种方法是将 IncreaseIndex 功能封装在锁中,或者您可以将索引的管理传递给单例 (Jon Skeet's Singleton implementation)。