|
Η λέξη-κλειδί κλειδώματος επισημαίνει ένα μπλοκ εντολών ως κρίσιμη ζώνη παίρνοντας ένα mutex για ένα δεδομένο αντικείμενο, εκτελώντας τη δήλωση και, στη συνέχεια, απελευθερώνοντας το κλείδωμα.
Η δήλωση κλειδώματος χρησιμοποιεί βασικά το Monitor.Enter και το Monitor.Exit, δηλαδή, το Monitor.Enter(αυτό) εκτελείται όταν εκτελείται το κλείδωμα(αυτό) και το Monitor.Exit(αυτό) εκτελείται στο τέλος του σγουρού στηρίγματος. Ποια είναι η σημασία του, για οποιοδήποτε αντικείμενο, το πρώτο μέρος της μνήμης είναι η διεύθυνση όλων των μεθόδων και το δεύτερο μέρος είναι ένα ευρετήριο. Δείχνει ένα SyncBlock στην περιοχή SyncBlock Cache του CLR. Τι σημαίνει αυτό? Δηλαδή, όταν εκτελείτε το Monitor.Enter(Object), εάν η τιμή ευρετηρίου του αντικειμένου είναι αρνητική, επιλέξτε ένα SyncBlock από το SyncBlock Cache και τοποθετήστε τη διεύθυνσή του στο ευρετήριο του αντικειμένου. Αυτό ολοκληρώνει το κλείδωμα που επισημαίνεται από το αντικείμενο και τα άλλα νήματα θέλουν να εκτελέσουν ξανά τη λειτουργία Monitor.Enter(object), η οποία θα λάβει ένα ευρετήριο με ένα θετικό αντικείμενο και, στη συνέχεια, θα περιμένει. Μέχρι ο δείκτης να γίνει αρνητικός, δηλαδή το νήμα χρησιμοποιεί το Monitor.Exit(object) για να μετατρέψει τον δείκτη σε αρνητικό. Τι πρέπει να προσέξετε όταν χρησιμοποιείτε την κλειδαριά:
1.Το κλείδωμα δεν μπορεί να κλειδώσει την τιμή null Ένα αντικείμενο μπορεί να δείχνει σε null, αλλά το null δεν χρειάζεται να απελευθερωθεί. (Δείτε επίσης: Κατανόηση του Full Null) 2.Το κλείδωμα δεν μπορεί να κλειδώσει τον τύπο συμβολοσειράς, αν και είναι επίσης τύπος αναφοράς. Επειδή ο τύπος συμβολοσειράς "αιωρείται" από το CLR Αυτό σημαίνει ότι υπάρχει μόνο μία παρουσία οποιασδήποτε δεδομένης συμβολοσειράς σε ολόκληρο το πρόγραμμα και το ίδιο αντικείμενο αντιπροσωπεύει αυτό το κείμενο σε όλα τα νήματα όλων των τομέων εφαρμογών που εκτελούνται. Επομένως, εφόσον τοποθετείται ένα κλείδωμα σε μια συμβολοσειρά με το ίδιο περιεχόμενο οπουδήποτε στη διαδικασία εφαρμογής, όλες οι παρουσίες αυτής της συμβολοσειράς στην εφαρμογή θα κλειδωθούν. Επομένως, είναι καλύτερο να κλειδώνετε ιδιωτικά ή προστατευόμενα μέλη που δεν θα διατηρηθούν. 3.locklock το αντικείμενο είναι το όριο μνήμης ενός μπλοκ προγράμματος 4. Ο τύπος τιμής δεν μπορεί να κλειδωθεί, επειδή το "αντικείμενο απελευθερώνεται" με κόκκινο χρώμα στο προηγούμενο κείμενο και ο τύπος τιμής δεν είναι τύπος αναφοράς 5. Το κλείδωμα αποφεύγει το κλείδωμα δημόσιων τύπων ή αντικειμένων που δεν ελέγχονται από το πρόγραμμα. Για παράδειγμα, εάν η παρουσία είναι δημόσια προσβάσιμη, το lock(this) μπορεί να είναι προβληματικό επειδή ο μη ελεγχόμενος κώδικας μπορεί επίσης να κλειδώσει το αντικείμενο. Αυτό μπορεί να οδηγήσει σε αδιέξοδα, όπου δύο ή περισσότερα νήματα περιμένουν να απελευθερώσουν το ίδιο αντικείμενο. Το κλείδωμα δημόσιων τύπων δεδομένων (σε αντίθεση με αντικείμενα) μπορεί επίσης να προκαλέσει προβλήματα για τον ίδιο λόγο. Όταν χρησιμοποιείτε το lock(this), η τιμή της μεταβλητής μέλους κλάσης μπορεί να αλλάξει με τη μέθοδο που δεν βρίσκεται στην κρίσιμη ζώνη
Σενάριο εφαρμογής: Συχνά χρησιμοποιείται για την αποτροπή αβέβαιων εξαιρέσεων στην τιμή των δημόσιων μεταβλητών που προκαλούνται από λειτουργίες πολλαπλών νημάτων για τη διασφάλιση της ασφάλειας των λειτουργιών
|