线程安全:Visual Basic构建线程安全的Singleton

  大抵而言Singleton 模式应该是设计模式中相当常用种了它能够节省宝贵 CPU 或内存资源避免不必要创建对象开销然而在多线程应用中对于那些非线程安全数据库组件传统 Singleton 将容易造成不稳定如果使用 Synclock 进行同步性能损耗可能将更大特别在并发访问高 ASP.net 应用中

  前十几天和网友聊天时候他把 ThreadwiseSingleton 发给了我我随后改写成泛型类事实上它基于 Threadslot 构建因此达到了线程隔离效果您需要传入个 Func(Of TResult) 完成工作如果您类中含有非托管资源并无法预见可能请使用个 Try...Finally... 包裹将要运行同时感到抱歉拖延了很久很久才发出来

  Imports .Threading
  ''' <summary>
  ''' 个线程隔离 Singleton
  ''' </summary>
  Public Class ThreadwiseSingletonClass ThreadwiseSingleton(Of T As IDisposable)
  Private Shared _Factory As Func(Of T)
  ''' <summary>
  ''' 获取构建此例子工厂类
  ''' </summary>
  Public Shared Property FactoryProperty Factory As Func(Of T)
  Get
  Return _Factory
  End Get
  Set(ByVal value As Func(Of T))
  _Factory = value
  End Set
  End Property
  ''' <summary>
  ''' 获得线程中例子
  ''' </summary>
  Public Shared ReadOnly Property InstanceProperty Instance As T
  Get
  Dim threadSlot As LocalDataStoreSlot = Thread.GetNamedDataSlot(GetType(T).)
  Dim threadSlotObj As Object = Thread.GetData(threadSlot)
  If threadSlotObj Is Nothing Then
  'Create singleton instance
  Dim ins As T = Factory.Invoke
  Thread.SetData(threadSlot, ins)
  Return ins
  Else
  Return DirectCast(threadSlotObj, T)
  End If
  End Get
  End Property
  ''' <summary>
  ''' 私有构造
  ''' </summary>
  Private Sub NewSub New
  End Sub
  ''' <summary>
  ''' 释放此 Singleton 例子使用资源请不要直接 Instance.Dispose
  ''' </summary>
  Public Shared Sub DisposeSub Dispose
  Instance.Dispose
  '放空槽
  Dim threadSlot As LocalDataStoreSlot = Thread.GetNamedDataSlot(GetType(T).)
  Thread.SetData(threadSlot, Nothing)
  End Sub
  End Class


Tags:  stl线程安全 什么是线程安全 java线程安全 线程安全

延伸阅读

最新评论

发表评论