Junior — Middle
Πώς μπορεί να αποτραπεί το αμοιβαίο μπλοκάρισμα δύο νημάτων σε μια πολυνηματική εφαρμογή;
sobes.tech AI
Απάντηση από AI
Ο αμοιβαίος αποκλεισμός (deadlock) συμβαίνει όταν δύο ή περισσότεροι νήματα περιμένουν αέναα την απελευθέρωση πόρων από το ένα το άλλο. Για την αποτροπή deadlock, μπορούν να χρησιμοποιηθούν οι ακόλουθες προσεγγίσεις:
- Αποφυγή εμφωλευμένων κλειδώσεων: ελαχιστοποίηση του αριθμού των πόρων που αποκτώνται ταυτόχρονα.
- Ταξινόμηση της απόκτησης πόρων: πάντα να αποκτούνται οι πόροι με την ίδια σειρά σε όλα τα νήματα.
- Χρήση χρονικών ορίων (timeouts): κατά την προσπάθεια απόκτησης ενός κλειδώματος, χρήση timeout για την αποφυγή ατέρμονης αναμονής.
- Χρήση ανώτερων επιπέδων primitive συγχρονισμού: π.χ., από το πακέτο
java.util.concurrentστο Android, που μειώνει την πιθανότητα deadlock.
Παράδειγμα ταξινομημένης απόκτησης πόρων:
synchronized (resourceA) {
synchronized (resourceB) {
// εργασία με τους πόρους
}
}
Αν όλα τα νήματα ακολουθούν την σειρά πρώτα resourceA, μετά resourceB, δεν θα προκύψει deadlock.