我在Castle Windsor注册了一个组件作为单身人士。这个对象正在我的应用程序中的许多其他地方使用,这是多线程的。
这两个对象是否有可能同时从该单例调用相同的方法,或者“调用它”将被阻塞,直到前一个对象得到结果?
由于
答案 0 :(得分:5)
您可以同时从不同的线程调用 Singleton 对象方法,如果没有锁定/同步代码,则不会阻止它们。线程不会等待其他人处理结果,并且会执行方法,因为它们会在单独的对象上执行方法。 这是因为每个线程都有一个单独的堆栈并具有不同的局部变量集。该方法的其余部分仅描述了需要对包含变量/字段的数据执行的操作的过程。
您可能需要注意的是Singleton对象上的方法是否访问任何静态方法或字段/变量。在这种情况下,您可能需要处理它的同步部分。您需要确保对共享资源的多线程访问才能使方法的执行可靠。
为了能够同步,您可能需要使用lock statement或其他形式的thread synchronization技术。
您可能需要参考this article from Wikipedia,它也提供有关C#线程本地存储的信息。
答案 1 :(得分:0)
您可以从不同的线程同时在一个对象上调用相同的方法或不同的方法。在特定方法中,您需要知道何时访问敏感变量(主要是当成员变量正在更改其值时)并且需要自己实现锁定,以便解决丢失的更新和其他异常。
您可以使用lock-statement锁定代码的一部分,这里有一篇关于Thread-Synchronization如何在.Net中工作的文章。
答案 2 :(得分:0)
Singleton的正常版本可能不是线程安全的,你可以在这里看到线程安全单例的不同实现。
http://tutorials.csharp-online.net/Singleton_design_pattern:_Thread-safe_Singleton