downloader_mgr_singleton.go 1.0 KB

123456789101112131415161718192021222324252627282930313233343536
  1. // Copyright 2021 Tencent Inc. All rights reserved.
  2. package downloader
  3. import (
  4. "context"
  5. "sync"
  6. )
  7. var (
  8. mgrInstance *CertificateDownloaderMgr
  9. mgrLock sync.RWMutex
  10. )
  11. // MgrInstance 获取 CertificateDownloaderMgr 默认单例,将在首次调用本方法后初始化
  12. // 本单例旨在伴随整个进程生命周期持续运行,请不要调用其 Stop 方法,否则可能影响平台证书的自动更新
  13. //
  14. // 如果你希望自行管理 Mgr 的生命周期,请使用 NewCertificateDownloaderMgr 方法创建额外的Mgr
  15. func MgrInstance() *CertificateDownloaderMgr {
  16. // 首次访问使用读锁
  17. mgrLock.RLock()
  18. if mgrInstance != nil {
  19. defer mgrLock.RUnlock()
  20. return mgrInstance
  21. }
  22. mgrLock.RUnlock()
  23. // 确认不存在后切换为写锁,由于 Go 没有读锁升级写锁的能力,因此解锁并重新捕获后,需要再次检查是否存在
  24. mgrLock.Lock()
  25. defer mgrLock.Unlock()
  26. if mgrInstance == nil {
  27. mgrInstance = NewCertificateDownloaderMgr(context.Background())
  28. }
  29. return mgrInstance
  30. }