之前我没有使用过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类以引用其他对象。
答案 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所说,可能更加懒散。