当前位置:网站首页>Go 4 modes Singleton
Go 4 modes Singleton
2022-07-02 22:49:00 【Donne - moi une bouteille de glace.】
Paresseux——Sécurité non threadée
Sécurité non threadée,Cela signifie que plusieurs objets peuvent être créés sous Multithreading.
//Utilisation de structures au lieu de classes
type Tool struct {
values int
}
//Créer une variable privée
var instance *Tool
//Méthode d'obtention d'un objet Singleton,La transmission de référence renvoie
func GetInstance() *Tool {
if instance == nil {
instance = new(Tool)
}
return instance
}
En termes de sécurité non - thread,Utilisation Sync.Mutex Le verrouillage assure la sécurité du fil,Mais comme la méthode est verrouillée chaque fois qu'elle est appelée,Pas très efficace sur le plan des performances
//Objet de verrouillage
var lock sync.Mutex
//Le verrouillage assure la sécurité du fil
func GetInstance() *Tool {
lock.Lock()
defer lock.Unlock()
if instance == nil {
instance = new(Tool)
}
return instance
}
Type affamé
Créer des objets directement,Il n'est pas nécessaire de juger en blanc,C'est aussi thread Safe,Le seul inconvénient est que l'objet est créé lors de l'importation du paquet,Et il est resté en mémoire.
GoLe chinois affamé peut être utilisé init Fonctions,Vous pouvez également utiliser des variables globales.
type cfg struct {
}
var cfg *config
func init() {
cfg = new(config)
}
// NewConfig Fournir un moyen d'obtenir une instance
func NewConfig() *config {
return cfg
}
type config struct {
}
//Variables globales
var cfg *config = new(config)
// NewConfig Fournir un moyen d'obtenir une instance
func NewConfig() *config {
return cfg
}
Double contrôle
C'est comme un paresseux. (Sécurité des fils)Sur la base de, Réduction des opérations de verrouillage , Assurer la sécurité des fils sans affecter les performances .
//Objet de verrouillage
var lock sync.Mutex
// Pour la première fois, le jugement n'est pas verrouillé , La deuxième serrure assure la sécurité du fil , Une fois l'objet créé , Obtenir des objets sans verrouillage .
func GetInstance() *Tool {
if instance == nil {
lock.Lock()
if instance == nil {
instance = new(Tool)
}
lock.Unlock()
}
return instance
}
sync.Once
Adoption sync.Once Pour s'assurer que la méthode de création de l'objet n'est exécutée qu'une seule fois
var once sync.Once
func GetInstance() *Tool {
once.Do(func() {
instance = new(Tool)
})
return instance
}
sync.Once L'intérieur est aussi essentiellement un moyen de double contrôle , Mais il serait plus concis dans l'écriture que d'écrire votre propre double vérification ,Voici Once Source de
func (o *Once) Do(f func()) {
// Déterminer si la méthode a été appliquée , Si elle est exécutée, elle ne l'est pas
if atomic.LoadUint32(&o.done) == 1 {
return
}
// Slow-path.
o.m.Lock()
defer o.m.Unlock()
//Pour verrouiller,Encore un jugement,Si ce n'est pas fait, Le drapeau a été balayé et la méthode a été appelée
if o.done == 0 {
defer atomic.StoreUint32(&o.done, 1)
f()
}
}
边栏推荐
- 对象与对象变量
- Dynamic memory allocation (malloc calloc realloc free)
- Market Research - current situation and future development trend of cell-based seafood market
- Pointer array parameter passing, pointer parameter passing
- Il n'est pas nécessaire d'appuyer longtemps sur la fonction de démarrage pour modifier Jelly [chapitre]
- U++ 学习笔记 ----松弛
- #include errors detected. Please update your includePath.
- Market Research - current situation and future development trend of preclinical medical device testing service market
- U++ learning note pile
- Oracle PL / SQL programming
猜你喜欢
[ODX studio edit PDX] -0.1- how to quickly view the differences in supported diagnostic information between variant variants (service, sub function...)
分享 10 个 JS 闭包面试题(图解),进来看看你能答对多少
Socket套接字C/S端流程
Simpleitk use - 3 Common operations
uniapp微信登录返显用户名和头像
牛客网:最大子矩阵
Oracle PL / SQL programming
`${}`的用法
Struct, bit segment, enumeration, union
Oracle-游标
随机推荐
[shutter] shutter application theme (themedata | dynamic modification theme)
【洛谷P1541】乌龟棋【DP】
[shutter] shutter page life cycle (initialization period | createstate | initstate | update period | build | destroy period | dispose)
地方经销商玩转社区团购模式,百万运营分享
Phpcms realizes the direct Alipay payment function of orders
杰理之样机在多次触摸后会触发关机【篇】
Market Research - current situation and future development trend of carob chocolate market
杰理之修改不需要长按开机功能【篇】
数据库系统概论第一章简答题-期末考得怎么样?
Zhong Xuegao responded that the product will not melt for 1 hour: it contains solid components and cannot melt into water
[LeetCode] 反转字符串【344】
小鹏P7出事故,安全气囊未弹出,这正常吗?
It's not easy to say I love you | use the minimum web API to upload files (swagger support) # yyds dry inventory #
Market Research - current situation and future development trend of anti-counterfeiting label market
#include errors detected. Please update your includePath.
[LeetCode] 回文数【9】
PHP微信抢红包的算法
UE4 game architecture learning notes
U++ learning note pile
Storage unit conversion