2

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

所以我从一个例子中得到了这个。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 类以引用它的其他对象。

4

2 回答 2

1

猜猜答案会是这样的:

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

于 2012-06-27T18:22:17.510 回答
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所说,可能会更懒惰。

于 2012-06-27T17:24:15.877 回答