当前位置:网站首页>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()
}
}边栏推荐
- [LeetCode] 数组中的第K个最大元素【215】
- 开发者分享 | HLS, 巧用AXI_master总线接口指令的定制并提升数据带宽-面积换速度...
- 任务和特权级保护
- 《乔布斯传》英文原著重点词汇笔记(十一)【 chapter nine】
- Using rendertext() to output multiple lines of text with rendertext() in R shiny
- New feature of go1.18: trylock, which has been tossed n times
- php优化foreach中的sql查询
- 建立自己的网站(22)
- Market Research - current market situation and future development trend of genome editing mutation detection kit
- JS获取display为none的隐藏元素的宽度和高度的解决方案
猜你喜欢
![[shutter] shutter custom fonts (download TTF fonts | pubspec.yaml configure font resources | synchronize resources | globally apply fonts | locally apply fonts)](/img/27/8594ba0b49d5008b7469967babed17.jpg)
[shutter] shutter custom fonts (download TTF fonts | pubspec.yaml configure font resources | synchronize resources | globally apply fonts | locally apply fonts)

Commodity information management system (C language document version)

数组进阶提高
![[foreign journal] sleep and weight loss](/img/81/42dcfae19e72a0bc761cb7a40fe5d5.jpg)
[foreign journal] sleep and weight loss

【ODX Studio编辑PDX】-0.1-如何快速查看各Variant变体间的支持的诊断信息差异(服务,Sub-Function...)

Struct, bit segment, enumeration, union

图形视图框架

牛客网:最大子矩阵

Oracle-游标

建立自己的网站(22)
随机推荐
#include errors detected. Please update your includePath.
Perceptron model and Application
解决 excel 文件上传时更改选中的文件出现错误net::ERR_UPLOAD_FILE_CHANGED
New feature of go1.18: introduce new netip Network Library
php优化foreach中的sql查询
Struct, bit segment, enumeration, union
[LeetCode] 存在重复元素【217】
[QT] Q multithreaded development - Analysis of multithreaded application examples (Mandelbrot)
Market Research - current market situation and future development trend of aircraft audio control panel system
手写ORM(对象关系映射)增删改查
杰理之样机在多次触摸后会触发关机【篇】
Micro service gateway selection, please accept my knees!
杰理之直接触摸样机的顶针反应不正常【篇】
Simpleitk use - 4 Strange question
Market Research - current market situation and future development trend of handheld wound imaging equipment
Market Research - current situation and future development trend of sickle cell therapy Market
Market Research - current situation and future development trend of preclinical medical device testing service market
Notes on key vocabulary in the English original of the biography of jobs (11) [chapter nine]
杰理之内置关机电流 1.2uA,之后不能长按开机【篇】
[QT] QT multithreading development - reentrancy and thread safety