线程安全工厂模式

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)。