Middle+
Σε ποια κατασκευή μετατρέπεται ο τελεστής lock σε C#;
sobes.tech AI
Απάντηση από AI
Ο τελεστής lock στη C# μετατρέπεται σε κλήσεις στις μεθόδους Monitor.Enter και Monitor.Exit (ή Monitor.TryEnter με επακόλουθο Monitor.Exit) σε ένα μπλοκ try...finally.
// Αρχικός κώδικας με lock
object lockObject = new object();
lock (lockObject)
{
// Προστατευόμενος κώδικας
}
// Η μετατροπή θα κάνει περίπου το εξής:
object lockObject = new object();
bool lockTaken = false; // Σημαία για την παρακολούθηση αν έχει αποκτηθεί ο μονομάχος
try
{
Monitor.Enter(lockObject, ref lockTaken); // Προσπάθεια απόκτησης του μονομάχου
// Μπορεί να χρησιμοποιηθεί το `Monitor.TryEnter` αντί του `Monitor.Enter`
if (lockTaken) // Ελέγχει αν ο μονομάχος αποκτήθηκε
{
// Προστατευόμενος κώδικας
}
}
finally
{
if (lockTaken) // Απελευθερώνει τον μονομάχο μόνο αν αποκτήθηκε
{
Monitor.Exit(lockObject);
}
}
Η χρήση του Monitor.Enter με την παράμετρο ref bool lockTaken και το μπλοκ try...finally διασφαλίζει ότι ο μονομάχος θα απελευθερωθεί ακόμα και σε περίπτωση εξαίρεσης στον προστατευμένο κώδικα.