zoukankan      html  css  js  c++  java
  • 线程安全的 Singleton Visual Basic

            大抵而言,Singleton 模式应该是设计模式中相当常用的一种了。它能够节省宝贵的 CPU 或内存资源,避免不必要的创建对象开销。然而,在多线程应用中,对于那些非线程安全的数据库组件,传统的 Singleton 将容易造成不稳定。如果使用 Synclock 进行同步,性能损耗可能将更大,特别在并发访问高的 ASP.net 应用中。
            前十几天和装配脑袋聊天的时候,他把 ThreadwiseSingleton 发给了我,我随后改写成泛型类。事实上,它基于 Threadslot 构建,因此达到了线程隔离的效果。您需要传入一个 Func(Of TResult) 完成初始化的工作。如果您的类中含有非托管资源,并无法预见可能的错误时,请使用一个 Try...Finally... 包裹将要运行的程序。同时感到抱歉的是,拖延了很久很久才发出来。

    Imports System.Threading

    ''' <summary>
    '
    '' 一个线程隔离的 Singleton。
    '
    '' </summary>
    Public Class ThreadwiseSingleton(Of T As IDisposable)
        
    Private Shared _Factory As Func(Of T)

        
    ''' <summary>
        ''' 获取构建此实例的工厂类。
        ''' </summary>
        Public Shared Property 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 Instance() As T
            
    Get
                
    Dim threadSlot As LocalDataStoreSlot = Thread.GetNamedDataSlot(GetType(T).ToString)
                
    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 New()

        
    End Sub

        
    ''' <summary>
        ''' 释放此 Singleton 实例使用的资源。请不要直接调用 Instance.Dispose()。
        ''' </summary>
        Public Shared Sub Dispose()
            Instance.Dispose()
            
    '放空槽
            Dim threadSlot As LocalDataStoreSlot = Thread.GetNamedDataSlot(GetType(T).ToString)
            Thread.SetData(threadSlot, 
    Nothing)
        
    End Sub

    End Class
  • 相关阅读:
    MPI消息传递MPI_Sendrecv的用法
    外网SSH访问内网LINUX服务器
    LINUX下Doxygen的配置与使用
    C语言中关键字const一般的用途
    Ubuntu使用apt-get时提示>”E: You must put some ‘source’ URIs in your sources.list”
    C语言中复数运算及调用blas,lapack中复数函数进行科学计算
    linux系统下C语言调用lapack ,blas库
    一封家书,道尽顶尖人才的思维境界
    学会用麦肯锡的方式思考
    记得自己的大梦想
  • 原文地址:https://www.cnblogs.com/lzhdim/p/1343870.html
Copyright © 2011-2022 走看看