design pattern go - singleton

Il y a deux principaux motifs de singleton: formule paresseux et mourir de faim la formule

// formule paresseux - threads 
// au lieu d'utiliser basée sur la structure 
struct type {outil 
	valeurs int 
} 
// build variables privées 
exemple var * Outil 
procédé d'obtention // singleton objet retourne un transfert de référence 
func GetInstance () * Outil { 
	SI exemple == {nul 
		exemple NOUVEAUTÉSNouveaux = (Tool) 
	} 
	d'instance de retour 
}

  

// formule paresseuse - thread-safe - pour effectuer une opération de blocage de chaque opération - n'est pas très haute performance 
// au lieu d'utiliser basée sur la structure 

struct type {outil 
	valeurs int 
} 
// Variables de construction privée 
instance var outil * 
// objet de verrouillage 
var sync.Mutex verrouillage 
// singleton méthode retourne d'acquisition objet d' une transmission de référence 
FUNC le GetInstance () {* outil 
	serrure.Serrure () 
	le lock.unlock defer () 
	SI == exemple nulle { 
		exemple nouvelle nouvelle = (Tool) 
	} 
	d'instance de retour 
}

  

// paresseux formule - deux vérifiés 
simultanément // puis paresseux base de formule (thread-safe) sur optimisé pour réduire l'opération de verrouillage, n'a aucune incidence sur les performances de threads 

// au lieu d'utiliser basée sur la structure 
struct type {Outil de 
	valeurs int 
} 
// objet serrure 
var verrouillage sync.Mutex 
outil instance var * 
// premier jugement n'a pas de verrouillage, deuxième verrou pour assurer la sécurité du fil, une fois que l'objet est créé, l'objet ne s'enfermé. 
la GetInstance FUNC () {* outil 
	IF exemple nul == { 
		serrure.Serrure () 
		SI == {exemple nulle 
			instance nouvelle nouvelle = (Tool) 
		} 
		lock.unlock () 
	} 
	instance de retour 
}

  

// faim fonction --init chinoise de style () pour créer 
// thread-safe, le seul inconvénient est que l'objet est créé tout en introduisant un paquet, et continuer à occuper dans la mémoire 
du type struct outil { 
} 
var outil outil * 
// initialize une exemples 
FUNC init () { 
  outil new new = (Tool) 
} 

// exemple newconfig fournit un procédé d'obtention 
FUNC NewTool () {* outil 
  retour outil 
}

  

// faim de style chinois - de créer une manière globale variable 
// thread-safe, le seul inconvénient est que l'objet est créé tout en introduisant un paquet, et continuer à occuper la mémoire
struct outil {type 
} 
// variable globale 
var = new nouvel outil outil * (Tool) 
// exemple newconfig fournit un procédé d'obtention 
FUNC newconfig () {* outil 
	retour outil 
}

En sync.Once assurez-vous de créer une méthode d'objet est exécuté une seule fois ---- ont revérifié l'effet du juge emballé sync.Once interne

var une fois sync.Once 
func GetInstance () * outil { 
	once.Do (func () { 
		exemple = new (Tool) 
	}) 
	instance de retour 
}

  

Je suppose que tu aimes

Origine www.cnblogs.com/chen-ya-ping/p/12463422.html
conseillé
Classement