Junior
Ποια είναι η λειτουργία της λέξης-κλειδιού lock στη γλώσσα C#;
sobes.tech AI
Απάντηση από AI
Η λέξη-κλειδί lock χρησιμοποιείται για την συγχρονισμό της πρόσβασης σε πόρους σε εφαρμογές πολλαπλών νημάτων. Διασφαλίζει ότι μόνο ένα νήμα μπορεί να εκτελέσει τον κώδικα μέσα στο μπλοκ lock σε μια δεδομένη στιγμή.
Αρχή λειτουργίας:
- Το
lockδέχεται ως όρισμα ένα αντικείμενο που χρησιμοποιείται ως mutex (monitor). - Πριν από την εκτέλεση του κώδικα μέσα στο μπλοκ
lock, το νήμα προσπαθεί να αποκτήσει αποκλειστικό κλείδωμα στο καθορισμένο αντικείμενο. - Αν το κλείδωμα είναι ελεύθερο, το νήμα το λαμβάνει και εκτελεί τον κώδικα.
- Αν το κλείδωμα είναι κατειλημμένο από άλλο νήμα, το τρέχον νήμα μπλοκάρεται (μεταβαίνει σε κατάσταση αναμονής) μέχρι το κλείδωμα να ελευθερωθεί.
- Όταν βγει από το μπλοκ
lock(ακόμα και σε περίπτωση εξαίρεσης), το κλείδωμα απελευθερώνεται αυτόματα.
Χρησιμοποιείται για την προστασία κοινόχρηστων πόρων, όπως πεδία κλάσεων, συλλογές ή άλλα αντικείμενα στα οποία μπορούν να έχουν πρόσβαση πολλαπλά νήματα ταυτόχρονα, για την αποφυγή καταστάσεων αγώνα (race conditions) και την διασφάλιση της ακεραιότητας των δεδομένων.
Παράδειγμα χρήσης:
public class SharedResource
{
private int _counter;
private readonly object _lockObject = new object(); // Αντικείμενο για συγχρονισμό
public void Increment()
{
lock (_lockObject) // Αποκλειστική πρόσβαση στο μπλοκ κώδικα
{
_counter++; // Ασφαλής μεταβολή του κοινόχρηστου πόρου
}
}
public int GetCounter()
{
lock (_lockObject) // Επίσης αποκλειστική πρόσβαση κατά την ανάγνωση
{
return _counter;
}
}
}
Σημαντικά σημεία:
- Το αντικείμενο για το κλείδωμα πρέπει να είναι τύπου αναφοράς και, κατά κανόνα, ιδιωτικό πεδίο (
readonly) για την αποτροπή εξωτερικής παρέμβασης. - Αποφύγετε το κλείδωμα τύπων όπως
string,thisήtypeof(TypeName), καθώς μπορούν να χρησιμοποιηθούν από κοινού ή να είναι προσβάσιμα από έξω, κάτι που μπορεί να οδηγήσει σε deadlocks ή λανθασμένη λειτουργία. - Το
lockείναι συντακτική ζάχαρη για τη χρήση των μεθόδων της κλάσηςMonitor.