Threadsafe工厂模式

时间:2016-04-20 15:46:05

标签: c# .net multithreading design-patterns factory-pattern

我正在编写一些简单的图形管理器,我决定使用工厂模式为我的图形创建边缘。我刚刚开始学习设计模式和线程。

我创建了工厂,返回了一些对象(边缘),创建方法,代码:

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 ++;写错了。

2 个答案:

答案 0 :(得分:4)

您可以使用:

long _index;

var nextIndex = Interlocked.Increment(ref _index);

这将确保您的索引在线程中保持唯一。使用简单的字段在这里最有意义,因为它是边缘工厂类的属性。

答案 1 :(得分:1)

另一种方法是将IncreaseIndex功能包装在一个锁中,或者你可以将索引的管理传递给一个单例(Jon Skeet's Singleton implementation)。