Après .NET 4.0, un type de chargement paresseux sécurisé a été fourni dans le .NET FrameworkParesseux Lazy peut fonctionner dans un environnement multithread, garantiGetValueLa fonction n’est exécutée qu’une seule fois, mettant ainsi en placeMode singleton
Par le passé, nous utilisions des verrous de jugement quadratique pour implémenter des motifs singletons, ou pour utiliser des fonctions d’initialisation statiques de classes Avec le type Laisy, ce processus est simplifié et les performances sont meilleures
Lorsque Lazy est créé, vous pouvez spécifier le mode d’installation du thread, il y a actuellement deux modes,Publication uniquement,Explicationet publication
Mode Publication Only
1. Exécuter la fonction d’initialisation et la mettre en boîte dans un système interneBoîtetype, résoudre le problème du jugement de valeur nul, si le cas a été créé, il retournera nul,Le processus est peu sécurisé en termes de threads
2. Déterminer si le m_boxed est vide, m_boxed est le champ sauvegardé par valeur, s’il est égal à vide, il est mis sur encadré, cette méthode peut garantir l’atomicité,Le procédé est sans filetage
3. Si CreateValue retourne vide, cela signifie que d’autres threads ont déjà créé des instances, puis définissez sur des instances déjà créées
4. Marquez la méthode d’initialisation comme initialisée, ce qui se produit généralement en cas d’exécution concurrente, et exécutez CreateValue plusieurs fois
Publication uniquementMode est utilisé en fonction deInterverrouillé.CompareExchange, cette classe contient des méthodes d’atomicitéCAS (Comparer et échanger)
Le CAS est implémenté à l’aide d’instructions atomiques fournies par le CPU, et différentes versions d’exécution peuvent avoir des implémentations différentes Implémentation spécifique interverrouillée Dans la méthode native, les amis intéressés peuvent vérifier l’implémentation spécifique via le code coreclr/jvm
Dans ce mode,Une fonction singleton peut s’exécuter plusieurs fois, mais au final il est garanti qu’une seule instance sera obtenue
Mode d’excution et de publication
Explicationet publicationmode utilisé dans ce modeVolatile+Monitor,MoniteurC’est vraiserrureL’implémentation de l’instruction, l’implémentation Monitor, dans le code natif, est un verrou lourd
MoniteurLa veille en file d’attente et en thread est prise en charge, ce qui peut garantir que l’ensemble du bloc de méthode soit exécuté dans un état monothread
Lien original :La connexion hyperlientérée est visible. |