线程安全的 Singleton - Visual Basic

本文介绍了一种改进的Singleton模式——ThreadwiseSingleton,该模式基于Threadslot实现线程隔离效果,有效解决了多线程环境下非线程安全组件的不稳定问题。文章提供了VB.NET的实现示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        大抵而言,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
资源下载链接为: https://pan.quark.cn/s/22ca96b7bd39 在当今的软件开发领域,自动化构建与发布是提升开发效率和项目质量的关键环节。Jenkins Pipeline作为一种强大的自动化工具,能够有效助力Java项目的快速构建、测试及部署。本文将详细介绍如何利用Jenkins Pipeline实现Java项目的自动化构建与发布。 Jenkins Pipeline简介 Jenkins Pipeline是运行在Jenkins上的一套工作流框架,它将原本分散在单个或多个节点上独立运行的任务串联起来,实现复杂流程的编排与可视化。它是Jenkins 2.X的核心特性之一,推动了Jenkins从持续集成(CI)向持续交付(CD)及DevOps的转变。 创建Pipeline项目 要使用Jenkins Pipeline自动化构建发布Java项目,首先需要创建Pipeline项目。具体步骤如下: 登录Jenkins,点击“新建项”,选择“Pipeline”。 输入项目名称和描述,点击“确定”。 在Pipeline脚本中定义项目字典、发版脚本和预发布脚本。 编写Pipeline脚本 Pipeline脚本是Jenkins Pipeline的核心,用于定义自动化构建和发布的流程。以下是一个简单的Pipeline脚本示例: 在上述脚本中,定义了四个阶段:Checkout、Build、Push package和Deploy/Rollback。每个阶段都可以根据实际需求进行配置和调整。 通过Jenkins Pipeline自动化构建发布Java项目,可以显著提升开发效率和项目质量。借助Pipeline,我们能够轻松实现自动化构建、测试和部署,从而提高项目的整体质量和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lzhdim

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值