Singleton初始化多次

时间:2012-06-27 16:27:01

标签: .net vb.net multithreading singleton

之前我没有使用过singleton,所以也许我有完全错误的想法,但我认为关键是它只能初始化一次,任何调用它的人都会引用相同的实例..?

所以我从一个例子中得到了这个。从我的程序中的100个不同的地方调用GetInstance(),当我调试时,“Prog = New Program”这一行不断受到攻击。我认为这究竟应该发生什么......或者我有一些根本的误解?

    ' ********************** THREAD SAFE SINGLETON **************************
 Public Class Program 

    Private Shared Prog As Program = Nothing
    Private Shared ReadOnly singletonLock As New Object()
    Public Shared Function GetInstance() As Program
        SyncLock singletonLock
            If Prog Is Nothing Then
                Prog = New Program
            End If
            Return Prog
        End SyncLock
    End Function

编辑:

似乎“New”子在第一个完成之前触发对Program.GetInstance的多次调用。这是因为我之前在这个类中有很多共享公共对象,因为类是单例的,所以不再共享它们。初始化时,这些对象调用Program类以引用其他对象。

2 个答案:

答案 0 :(得分:1)

猜猜答案是这样的:

似乎“New”子在第一个完成之前触发对Program.GetInstance的多次调用。这是因为我之前在这个类中有很多共享公共对象,因为类是单例的,所以不再共享它们。初始化时,这些对象调用Program类以引用其他对象。所以;循环参考。

答案 1 :(得分:0)

这是c#的重点,但可能会更好一些(邮政编码应该可以工作。)

Public NotInheritable Class Singleton
    Private Shared ReadOnly Singleton instance = new Singleton();

    ' Explicit static constructor to tell compiler
    ' not to mark type as beforefieldinit
    Shared Sub New()
    End Sub

    Private Sub New()
    End Sub

    Public Shared ReadOnly Property Instance As Singleton
        Get
            return Me.instance;
        End Get
    End Property
End Class

如果没有任何锁定,应该可以很好地工作,但正如Skeet所说,可能更加懒散。