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

ロックなしでうまく機能するはずですが、スキートが言うように、怠惰になる可能性があります。

于 2012-06-27T17:24:15.877 に答える