【问题标题】:Threadsafe factory pattern线程安全工厂模式
【发布时间】:2016-04-20 15:46:05
【问题描述】:

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

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

public Edge<T> CreateEdge(Vertex<T> firstVertex, Vertex<T> secondVertex)
{
    var edge = new Edge<T>(firstVertex, secondVertex, _nextIndex);

    _nextIndex++;

    return edge;
}

这是我的问题。如果该工厂将由多个线程共享,那么返回多个具有相同索引的边是可能的。

这个问题的最佳解决方案是什么?
我应该使用锁还是一些互斥锁?
或者是我设计不好的类的错,使用工厂?

编辑#1: 改变IncreaseIndex() -> _nextIndex++;写的时候出错。

【问题讨论】:

  • NextIndex 是一个属性吗?这就是我根据名称假设的,但只是想确定
  • 是的,我输入错误。已更正
  • 您可能想退后一步,考虑您是否真的希望多个线程同时改变图形。使用线程共享可变状态会变得非常棘手,非常快。可能还有其他方法可以构建您的问题,以便您可以并行处理隔离良好的数据块,而线程之间的同步最少。

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


【解决方案1】:

你可以使用:

long _index;

var nextIndex = Interlocked.Increment(ref _index);

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

【讨论】:

  • 感谢您的回答。这解决了我的问题。我以前从未使用/听说过 Interlocked 课程。我认为现在和将来都会非常有帮助:)
【解决方案2】:

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

【讨论】:

  • 感谢您的回答。我考虑过使用单例,但它限制了我,因为它可能会发生,我有几个图并且每个图都应该有自己的边缘工厂。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-04
相关资源
最近更新 更多