2012-06-27 68 views
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 

編輯:

看來的「新建」子引發許多呼叫Program.GetInstance的,第一個完成之前。這是由於我早些時候在這個類中擁有大量共享公共對象,因爲該類是單身人士,所以不再共享。這些對象在初始化時調用Program類以引用其他對象。

+0

看起來對我來說很合適。 –

+0

如果'Prog'一直在不斷被重新使用,那麼將它設置爲'Nothing'?不應該'Program'類也有一個私有構造函數,所以實例化它的唯一方法是通過'GetInstance()'? – Jodrell

+3

喬恩Skeet關於單身人士的文章是一個很好的參考:http://csharpindepth.com/Articles/General/Singleton.aspx –

回答

1

猜答案是這樣的:

看來的「新建」子引發許多呼叫Program.GetInstance的,第一個完成之前。這是由於我早些時候在這個類中擁有大量共享公共對象,因爲該類是單身人士,所以不再共享。這些對象在初始化時調用Program類以引用其他對象。所以;一個循環參考。

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說,可能是懶惰。

+0

認爲我們不能在VB中共享類? – bretddog

+0

正確,使我的答案失敗 – Jodrell

+0

嘗試,我切換到'NotInheirtable'這實際上轉化爲'密封' – Jodrell