Sobes.tech
Middle

Τι είναι οι αισιόδοξες και απαισιόδοξες κλειδώματα;

sobes.tech AI

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

Οι αισιόδοξοι και απαισιόδοξοι αποκλεισμοί είναι προσεγγίσεις διαχείρισης παράλληλης πρόσβασης σε κοινά δεδομένα σε ανταγωνιστικά περιβάλλοντα (πολλαπλές νήματα εφαρμογών, βάσεις δεδομένων).

Απαισιόδοξος αποκλεισμός:

Υποθέτει ότι οι συγκρούσεις κατά την πρόσβαση σε δεδομένα είναι πιθανές. Πριν αποκτήσουν πρόσβαση σε πόρο, το νήμα ή η συναλλαγή τον αποκλείει (αποκλεισμός αποκλειστικός ή διαμοιρασμένος). Άλλα νήματα που προσπαθούν να αποκτήσουν πρόσβαση θα περιμένουν μέχρι να αφαιρεθεί ο αποκλεισμός.

  • Πλεονεκτήματα: Διασφαλίζει την ακεραιότητα των δεδομένων, είναι απλός στην υλοποίηση σε περιβάλλοντα με χαμηλό ανταγωνισμό.
  • Μειονεκτήματα: Μπορεί να οδηγήσει σε ακινητοποιήσεις (deadlocks), μείωση της διαπερατότητας σε υψηλό ανταγωνισμό.
  • Παραδείγματα: η λέξη-κλειδί synchronized στη Java, αποκλεισμοί σε επίπεδο γραμμής ή πίνακα σε βάσεις δεδομένων.
// Παράδειγμα απεικόνισης απειλητικού αποκλεισμού στη Java
public class Counter {
    private int count = 0;

    public synchronized void increment() {
        count++; // Αποκλεισμός σε αντικείμενο, μόνο ένα νήμα μπορεί να εκτελέσει αυτή τη μέθοδο ταυτόχρονα
    }

    public synchronized int getCount() {
        return count;
    }
}

Αισιόδοξος αποκλεισμός:

Υποθέτει ότι οι συγκρούσεις κατά την πρόσβαση σε δεδομένα είναι απίθανες. Η πρόσβαση στα δεδομένα γίνεται χωρίς αποκλεισμούς. Πριν από την αποθήκευση αλλαγών, ελέγχεται αν τα δεδομένα έχουν αλλάξει από άλλο νήμα από τη στιγμή που διαβάστηκαν. Αν έχουν αλλάξει, η λειτουργία ακυρώνεται και συνήθως επαναλαμβάνεται (retry).

  • Πλεονεκτήματα: Υψηλή διαπερατότητα σε χαμηλό ανταγωνισμό, χωρίς προβλήματα deadlocks.
  • Μειονεκτήματα: Μπορεί να προκύψουν συγκρούσεις που απαιτούν επαναλήψεις, καθιστώντας τη λογική πιο πολύπλοκη. Δεν είναι κατάλληλο για μακροχρόνιες λειτουργίες ή υψηλό βαθμό συγκρούσεων.
  • Παραδείγματα: λειτουργίες Compare-And-Swap (CAS), διαχείριση εκδόσεων (versioning) σε βάσεις δεδομένων (π.χ., χρήση στήλης έκδοσης ή χρονικής σήμανσης).
// Παράδειγμα αισιόδοξου αποκλεισμού με χρήση CAS (java.util.concurrent.atomic)
import java.util.concurrent.atomic.AtomicInteger;

public class AtomicCounter {
    private AtomicInteger count = new AtomicInteger(0);

    public void increment() {
        // Προσπάθεια ατομικής αύξησης της τιμής
        // Αν η τιμή άλλαξε μεταξύ ανάγνωσης και προσπάθειας ενημέρωσης, η λειτουργία επαναλαμβάνεται
        count.incrementAndGet();
    }

    public int getCount() {
        return count.get();
    }
}

Σύγκριση:

Χαρακτηριστικό Απαισιόδοξος αποκλεισμός Αισιόδοξος αποκλεισμός
Υπόθεση Οι συγκρούσεις είναι πιθανές Οι συγκρούσεις είναι απίθανες
Προσέγγιση Αποκλεισμός μέχρι την πρόσβαση Πρόσβαση χωρίς αποκλεισμό, έλεγχος κατά την εγγραφή
Σε υψηλό ρυθμό συγκρούσεων Μπορεί να προκαλέσει αποκλεισμούς, να μειώσει τη διαπερατότητα Συχνές επανεκκινήσεις λειτουργιών, μείωση απόδοσης
Σε χαμηλό ρυθμό συγκρούσεων Μπορεί να δημιουργήσει πρόσθετα έξοδα Υψηλή διαπερατότητα
Πρόβλημα Deadlock Υπάρχει πιθανότητα Αδύνατο (από την άποψη του ανταγωνιστικού πρόσβασης σε πόρο)