Η εντολή κλειδώματος παίρνει το mutex ενός δεδομένου αντικειμένου, εκτελεί ένα μπλοκ εντολών και, στη συνέχεια, απελευθερώνει το κλείδωμα. Όταν κρατάτε μια κλειδαριά, το νήμα που συγκρατεί την κλειδαριά μπορεί να αποκτήσει και να απελευθερώσει ξανά την κλειδαριά. Οποιοδήποτε άλλο νήμα εμποδίζεται να πάρει την κλειδαριά και περιμένει μέχρι να απελευθερωθεί η κλειδαριά.
Αναθεώρηση:
Χρήση του κωδικού κλειδώματος
Ισοδύναμο με
Μπορεί να θεωρηθεί ότι ο υποκείμενος κώδικας του Lock υλοποιείται από το Monitor.
Δεδομένου ότι ο κώδικας χρησιμοποιεί δοκιμάσει... final, οπότε ακόμα κι αν προστεθεί μια εξαίρεση στο σώμα της δήλωσης κλειδώματος, η κλειδαριά απελευθερώνεται.
Δεν μπορείτε να χρησιμοποιήσετε το κλείδωμα τελεστή αναμονής στο σώμα της δήλωσης.Δεν μπορείτε να το χρησιμοποιήσετε στο σώμα της δήλωσηςΠεριμένετεΚλειδαριά χειριστή。 Δεν μπορείτε να χρησιμοποιήσετε το κλείδωμα τελεστή αναμονής στο σώμα της δήλωσης. Δεν μπορείτε να χρησιμοποιήσετε το κλείδωμα τελεστή αναμονής στο σώμα της δήλωσης. Αυτή η πρόταση είναι πολύ σημαντική!
Τεκμηρίωση:Η σύνδεση με υπερσύνδεσμο είναι ορατή.
Δοκιμάζω τον κώδικα μόνος μου,Χρησιμοποιήστε το Task για να λάβετε το κλείδωμα και χρησιμοποιήστε το wait για αποκλεισμό, ο κωδικός έχει ως εξής:
Μετά την εκτέλεση του παρακάτω κώδικα αρκετές φορές, το αποτέλεσμα εκτέλεσης δεν είναι το αναμενόμενο.
Γιατί? Εάν προσπαθήσετε να χρησιμοποιήσετε τη λέξη-κλειδί αναμονής όταν προσπαθείτε να χρησιμοποιήσετε τη λέξη-κλειδί αναμονής στο μπλοκ κλειδώματος, θα λάβετε αυτό το σφάλμα μεταγλώττισης: δεν είναι δυνατή η αναμονή στο σώμα μιας δήλωσης κλειδώματος. Ο λόγος είναι ότι μετά την ολοκλήρωση της αναμονής, η μέθοδος μπορεί να εκτελεστεί σε διαφορετικό νήμα αντί για το νήμα (νήμα κλήσης) πριν από τη λέξη-κλειδί αναμονής.lockλέξη-κλειδίίδιο νήμαΚλειδώστε και απελευθερώστε το κλείδωμα στην κλειδαριά。 Τροποποιήστε τον κώδικα για να δείτε τον λόγο πιο διαισθητικά:
Λάβετε το αναγνωριστικό σπειρώματος της κλειδαριάς και το αναγνωριστικό σπειρώματος της απελευθέρωσης κλειδαριάς,Προφανώς όχι σε ένα νήμα, επομένως η κλειδαριά δεν μπορεί να απελευθερωθεί με επιτυχία, όπως φαίνεται στο παρακάτω σχήμα:
Προσπάθησα να τροποποιήσω τον κώδικα, δοκιμάσαμε με νήμα, εκτελέσαμε πολλές φορές και λειτούργησε όπως αναμενόταν, ο κώδικας έχει ως εξής:
(Τέλος)
|