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