Utilities/Get-ProviderLock.ps1

# Dedicated sync object for serializing lazy lock creation
if (-not $script:__LockInitGuard) {
    $script:__LockInitGuard = New-Object object
}

function Get-ProviderLock {
    param($Provider)
    if (-not $Provider.__Lock) {
        # Double-checked locking: serialize only the first initialization
        [System.Threading.Monitor]::Enter($script:__LockInitGuard)
        try {
            if (-not $Provider.__Lock) {
                $Provider.__Lock = New-Object System.Threading.ReaderWriterLockSlim(
                    [System.Threading.LockRecursionPolicy]::NoRecursion)
            }
        }
        finally {
            [System.Threading.Monitor]::Exit($script:__LockInitGuard)
        }
    }
    $Provider.__Lock
}