随笔 - 3440, 文章 - 0, 评论 - 739, 阅读 - 1110万
  管理

线程安全的 Singleton - Visual Basic

Posted on   lzhdim  阅读(645)  评论(0编辑  收藏  举报
        大抵而言,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
编辑推荐:
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
· Linux系统下SQL Server数据库镜像配置全流程详解
· 现代计算机视觉入门之:什么是视频
· 你所不知道的 C/C++ 宏知识
阅读排行:
· 不到万不得已,千万不要去外包
· C# WebAPI 插件热插拔(持续更新中)
· 会议真的有必要吗?我们产品开发9年了,但从来没开过会
· 【译】我们最喜欢的2024年的 Visual Studio 新功能
· 如何打造一个高并发系统?
2025年1月25日 星期六 【蛇】丁丑月甲午日 乙巳年 十二月廿六
您的IP:3.139.108.186,操作系统:未知操作系统,浏览器:未知浏览器
Copyright (C) 2000-2025 Lzhdim Software All Rights Reserved
点击右上角即可分享
微信分享提示