C# 线程安全工厂模式
我正在编写一些简单的图形管理器,我决定使用factory模式为我的图形创建边。我刚刚开始学习设计模式和线程 我创建了工厂,返回一些对象(边),创建方法,代码:C# 线程安全工厂模式,c#,.net,multithreading,design-patterns,factory-pattern,C#,.net,Multithreading,Design Patterns,Factory Pattern,我正在编写一些简单的图形管理器,我决定使用factory模式为我的图形创建边。我刚刚开始学习设计模式和线程 我创建了工厂,返回一些对象(边),创建方法,代码: public Edge<T> CreateEdge(Vertex<T> firstVertex, Vertex<T> secondVertex) { var edge = new Edge<T>(firstVertex, secondVertex, _nextIndex);
public Edge<T> CreateEdge(Vertex<T> firstVertex, Vertex<T> secondVertex)
{
var edge = new Edge<T>(firstVertex, secondVertex, _nextIndex);
_nextIndex++;
return edge;
}
公共边CreateEdge(顶点第一顶点,顶点第二顶点)
{
var edge=新边(第一个顶点、第二个顶点、_nextIndex);
_nextIndex++;
返回边缘;
}
这是我的问题。如果该工厂将由多个线程共享,则可能返回具有相同索引的多条边
这个问题的最佳解决方案是什么我应该使用锁还是互斥锁
还是因为我的设计类不好,使用工厂 编辑#1: 更改增量索引()->_nextIndex++;写错了 您可以使用:
long _index;
var nextIndex = Interlocked.Increment(ref _index);
这将确保索引在线程间保持唯一性。在这里使用简单字段最有意义,因为它是edge factory类的属性。您可以使用:
long _index;
var nextIndex = Interlocked.Increment(ref _index);
这将确保索引在线程间保持唯一性。在这里使用简单字段最有意义,因为它是edge factory类的属性。另一种方法是将IncreaseIndex功能包装在锁中,或者将索引管理传递给singleton()。另一种方法是将IncreaseIndex功能包装在锁中,或者您可以将索引的管理传递给singleton()。NextIndex是属性吗?这是我根据名字所做的假设,但我只是想确认一下,是的,我打错了。修正后,您可能需要退一步,考虑是否真的希望多个线程同时更改图表。使用线程共享可变状态可能会变得非常棘手,速度非常快。可能还有其他方法来组织您的问题,这样您就可以在线程之间进行最小同步的情况下并行处理非常隔离的数据块。NextIndex是一个属性吗?这是我根据名字所做的假设,但我只是想确认一下,是的,我打错了。修正后,您可能需要退一步,考虑是否真的希望多个线程同时更改图表。使用线程共享可变状态可能会变得非常棘手,速度非常快。也许还有其他方法可以解决您的问题,这样您就可以在线程之间进行最小同步的情况下,并行处理非常隔离的数据块。谢谢您的回答。我考虑过使用singleton,但它限制了我,因为它可能发生,我有几个图,每个图都应该有自己的edge工厂。谢谢你的回答。我考虑过使用singleton,但它限制了我,因为它可能发生,我有几个图,每个图都应该有自己的edge工厂。谢谢你的回答。这解决了我的问题。我以前从未使用过/听过联锁类。我想无论是现在还是将来都会很开心:)谢谢你的回答。这解决了我的问题。我以前从未使用过/听过联锁类。我觉得现在和将来都会很开心:)