Dans .NET, pourquoi lock(someObject)
mis en œuvre comme il l'est ? De la façon dont je le vois, il y avait deux options pour stocker les informations de synchronisation :
- Table de hachage globale pour la carte
memory address -> synchronization info
- Stocker le pointeur ou l'index dans
synchronization info
dans chaque objet qui pourrait être verrouillé.
Dans la première implémentation, il n'y a pas de surcharge de mémoire pour les objets qui ne sont pas verrouillés - ils n'ont pas d'entrées dans la table de hachage. Cependant, .NET utilise la deuxième implémentation, en stockant un champ Sync Block Index dans l'en-tête de chaque objet .NET, même ceux qui ne sont jamais verrouillés.
Quelle est la motivation de ce choix ? Pour quels scénarios est-il optimisé ?