2009-12-18 79 views
0

我有一个Windows服务托管几个WCF服务。在我的Windows服务中,我有单身行为的几个对象。这些对象可以通过外部的WCF服务访问。一个调用可以将一个值放入对象中,另一个调用可以检索该值。共享对象和多线程问题。我应该在乎吗?

我应该关心多线程问题吗?我没有自己开始任何线程。但无论如何,我应该在访问单例对象时进行任何锁定吗?访问对象的方法怎么样?他们不应该被标记为同步?

编辑这些对象不是单身人士。这些对象是使用具有单例行为的IoC创建的。

回答

2

每次调用到你的服务是一个线程它自己的。 所以你甚至开始创建线程,其中很多。

我不打算讨论我对单身人士的立场等。但是,当你有共享可变数据时,你思考如何保护它免受并发访问。 如果在线程b正在寻找某些内容时线程将某些东西放在那里,那么您可能会得到不可预知的结果。

最明显的解决方案是使用锁来读取和写入。 查看文档到ReaderWriterLockSlim这应该让你开始。

+0

我的一个朋友也指出我在System.Threading中也有一个Semaphore类。你怎么看 ?它看起来像这个类只控制对资源池的访问。 – user137348 2009-12-18 15:24:11

+0

如果你想开始简单,你可以轻松地使用C#的“锁定”语句。这只不过是Monitor类中的语法糖。但是,请确保不要让您调用的实例在您的单例类之外可见,以防止自己死锁。 – 2009-12-18 15:43:17

1

是的,我想你应该。不久之前就有人问过类似的东西。

Object that is needed throughout the application

一些解释

Implementing Singleton in C#看到这,看着多线程辛格尔顿

而且Ist way of implementing Singleton Pattern in C#:正在寻求实现在C#Singleton模式的IIIrd方式:简单的多线程Singleton模式和C#实现Singleton模式的IVth方式:多线程的Singleton模式

+0

+1不要介意有用的参考资料,只是简单地为“是” – 2009-12-18 14:40:19

+2

如果单例是不可变的,那么只是使单例模式样板代码线程安全不会有多大帮助。如果他正在做下面的事情(我认为他是),他必须确保如何锁定这些重新设计单人.Instance.AddSome(123,“some”); Singleton.Instance.GimmeSome(123); – 2009-12-18 14:44:03

+0

是的,那是真的。 – 2009-12-18 14:45:25