Sobes.tech
Junior — Middle

Πώς μπορεί να αποτραπεί το αμοιβαίο μπλοκάρισμα δύο νημάτων σε μια πολυνηματική εφαρμογή;

sobes.tech AI

Απάντηση από AI

Ο αμοιβαίος αποκλεισμός (deadlock) συμβαίνει όταν δύο ή περισσότεροι νήματα περιμένουν αέναα την απελευθέρωση πόρων από το ένα το άλλο. Για την αποτροπή deadlock, μπορούν να χρησιμοποιηθούν οι ακόλουθες προσεγγίσεις:

  • Αποφυγή εμφωλευμένων κλειδώσεων: ελαχιστοποίηση του αριθμού των πόρων που αποκτώνται ταυτόχρονα.
  • Ταξινόμηση της απόκτησης πόρων: πάντα να αποκτούνται οι πόροι με την ίδια σειρά σε όλα τα νήματα.
  • Χρήση χρονικών ορίων (timeouts): κατά την προσπάθεια απόκτησης ενός κλειδώματος, χρήση timeout για την αποφυγή ατέρμονης αναμονής.
  • Χρήση ανώτερων επιπέδων primitive συγχρονισμού: π.χ., από το πακέτο java.util.concurrent στο Android, που μειώνει την πιθανότητα deadlock.

Παράδειγμα ταξινομημένης απόκτησης πόρων:

synchronized (resourceA) {
    synchronized (resourceB) {
        // εργασία με τους πόρους
    }
}

Αν όλα τα νήματα ακολουθούν την σειρά πρώτα resourceA, μετά resourceB, δεν θα προκύψει deadlock.