Εάν μεταβιβάσετε έναν τύπο τιμής, θα τοποθετηθεί σε πλαίσιο και την επόμενη φορά που θα εκτελεστεί ο κώδικας εδώ, θα τοποθετηθεί ξανά σε πλαίσιο και δεν θα είναι το ίδιο αντικείμενο δύο φορές, επομένως δεν μπορεί να κλειδωθεί
κλειδαριά (x)
{ ...
}
Το κλείδωμα γίνεται στην πραγματικότητα μέσω του αντικειμένου Monitor:
Τα παραπάνω ισοδυναμούν με:
System.Object obj = (System.Object)x; System.Threading.Monitor.Enter(obj); Δοκιμάστε
{ ...
} τελικά
{ System.Threading.Monitor.Exit(obj);
}
Στη συνέχεια, για να παραθέσω τα αρχικά λόγια του MSDN: Χρησιμοποιήστε το Monitor για να κλειδώσετε αντικείμενα (δηλαδή, τύπους αναφοράς) και όχι τύπους τιμών. Όταν μεταβιβάζετε μια μεταβλητή τύπου τιμής στο Enter, τοποθετείται σε πλαίσιο ως αντικείμενο. Εάν περάσετε ξανά την ίδια μεταβλητή στο Enter, εγκιβωτίζεται ως ξεχωριστό αντικείμενο και το νήμα δεν μπλοκάρει. Σε αυτήν την περίπτωση, ο κώδικας που υποτίθεται ότι προστατεύει το Monitor δεν προστατεύεται. Επιπλέον, όταν περνάτε τη μεταβλητή στο Exit, δημιουργείται ένα άλλο ξεχωριστό αντικείμενο. Επειδή το αντικείμενο που μεταβιβάζεται στο Exit είναι διαφορετικό από το αντικείμενο που μεταβιβάζεται στο Enter, το Monitor ρίχνει το SynchronizationLockException. Για περισσότερες πληροφορίες, ανατρέξτε στο εννοιολογικό θέμα Οθόνες. |