Τι είναι SyncΧρονισμός σε Java; μέθοδος, μπλοκ, στατικός τύπος

Τι είναι SyncΧρονισμός σε Java;

Στην Ιάβα, syncΤο hronization αναφέρεται στην ικανότητα ελέγχου της πρόσβασης πολλαπλών νημάτων σε οποιονδήποτε κοινόχρηστο πόρο. Είναι μια ιδανική επιλογή όπου θέλουμε να επιτρέψουμε μόνο σε ένα νήμα να έχει πρόσβαση στον κοινόχρηστο πόρο.

Αυτή η προσέγγιση εκτέλεσης αναφέρεται συνήθως ως «αsyncχρονοπρογραμματισμός. Υπάρχουν επίσης νήματα σε αυτούς τους επεξεργαστές, οι οποίοι είναι ελαφριές διεργασίες που μπορούν να εκτελέσουν εντολές ταυτόχροναneoάχρηστα.

Τύποι Syncχρονισμός

Υπάρχουν δύο τύποι syncμέθοδοι χρονισμού σε Java:

1) Διαδικασία syncχρονισμός

2) Νήμα syncχρονισμός.

Ας μελετήσουμε το Thread και Διαδικασία syncχρονισμός λεπτομερώς.

Διαδικασία syncχρονισμός: Καταφέρνει syncσυγχρονισμός μεταξύ προγραμμάτων. Για παράδειγμα, προγράμματα όπως το `Microsoft Word" και "Acrobat reader" εκτελούνται ως μεμονωμένες διαδικασίες.

Νήμα syncχρονισμός: Η ταυτόχρονη εκτέλεση του κρίσιμου πόρου από δύο ή περισσότερα Threads ονομάζεται Thread Syncχρονισμός. Μπορείτε να ομαδοποιηθείτε περαιτέρω σε αλληλοαποκλειόμενη επικοινωνία και επικοινωνία μεταξύ νημάτων.

Τι είναι το Lock στην Java;

Το κλείδωμα στην Java είναι χτισμένο γύρω από μια εσωτερική οντότητα γνωστή ως οθόνη ή κλειδαριά. Όλο το αντικείμενο έχει μια κλειδαριά που σχετίζεται με αυτά. Έτσι, το νήμα που χρειάζεται συνεπή πρόσβαση στα πεδία ενός αντικειμένου πρέπει να αποκτήσει το κλείδωμα του αντικειμένου πριν αποκτήσει πρόσβαση σε αυτά και απελευθερώνει το κλείδωμα όταν ολοκληρωθεί η εργασία. Αυτό διασφαλίζει ότι μόνο ένα νήμα έχει πρόσβαση στα κοινόχρηστα δεδομένα κάθε φορά.

Πρόγραμμα πολλαπλών νημάτων με syncχρονισμός

Ένα πρόγραμμα πολλαπλών νημάτων είναι μια μέθοδος ή μπλοκ που προστατεύεται από παρεμβολές από άλλα νήματα που μοιράζονται τον ίδιο πόρο που υποδεικνύεται χρησιμοποιώντας το «syncλέξη-κλειδί «χρονισμένη».

Χρήση του syncσυγχρονισμένη μέθοδος

Οποιαδήποτε μέθοδος δηλώνεται ως syncη χρονική είναι γνωστή ως α syncσυγχρονισμένη Μέθοδος. Χρησιμοποιείται επίσης για το κλείδωμα ενός αντικειμένου για οποιονδήποτε κοινόχρηστο πόρο. Έτσι, όταν ένα νήμα καλεί a syncσυγχρονισμένη μέθοδος. Παίρνει αυτόματα στην κατοχή του την κλειδαριά για αυτό το αντικείμενο και την απελευθερώνει όταν ολοκληρώσει την εργασία του.

Σημείωση: Η syncΗ συγχρονισμένη λέξη-κλειδί δεν μπορεί να λειτουργήσει με κλάσεις και μεταβλητές. Μόνο μέθοδοι και μπλοκ μπορούν να χρησιμοποιηθούν με τη λέξη-κλειδί.

Γιατί να χρησιμοποιήσετε το Syncσυγχρονισμένη μέθοδος;

  • Χρησιμοποιείται για το κλείδωμα ενός αντικειμένου για τυχόν κοινόχρηστους πόρους.
  • Το αντικείμενο παίρνει την κλειδαριά όποτε το syncχρονισμένη μέθοδος ονομάζεται.
  • Η κλειδαριά δεν απελευθερώνεται έως ότου το νήμα ολοκληρώσει τη λειτουργία του

Σύνταξη:

Acess_modifiers synchronized return_type method_name (Method_Parameters) {
}
class MathService {
    synchronized void getSumOfArray(int[] numbers) {
     int sum = 0;

         for (int number : numbers) {
             System.out.println(Thread.currentThread()
                     .getName()
                     + " adds "
                     + sum + " to "
                     + number + " to get -> "
                     + (sum += number));

             try {
                 Thread.sleep(500);
             } catch (InterruptedException e) {
                 throw new RuntimeException(e);
             }
         }
    }
}
public class Synchronization {
    public static void main(String[] args) {
        MathService mathService = new MathService();

        Thread threadOne = new Thread(() ->
                mathService.getSumOfArray(new int[]{10, 11, 12}));
        Thread threadTwo = new Thread(() ->
                mathService.getSumOfArray(new int[]{20, 21, 22}));

        threadOne.start();
        threadTwo.start();
    }
}

Επεξήγηση Κώδικα:

Εκτελέστε αυτό το παράδειγμα και παρατηρήστε ότι το νήμα «0» παίρνει πρώτα το κλείδωμα του αντικειμένου «mathService» και χρησιμοποιεί αυτό το κλείδωμα αποκλειστικά μέχρι να ολοκληρωθεί η εκτέλεσή του. Τα νήματα "0" και "1" δεν παρεμβάλλονται σε αυτόν τον κώδικα. Η έξοδος είναι όπως φαίνεται παρακάτω.

Παραγωγή:

Thread-0 adds 0 to 10 to get -> 10
Thread-0 adds 10 to 11 to get -> 21
Thread-0 adds 21 to 12 to get -> 33
Thread-1 adds 0 to 20 to get -> 20
Thread-1 adds 20 to 21 to get -> 41
Thread-1 adds 41 to 22 to get -> 63

Χρησιμοποιώντας ένα syncχρονισμένο μπλοκ

Ας υποθέσουμε ότι δεν θέλετε syncχρονομετρήστε ολόκληρη τη μέθοδο. Αντίθετα, θέλετε να syncχρονομετρήστε μερικές γραμμές κώδικα. Εκείνη την εποχή, το Syncχρονομετρημένο μπλοκ βοήθησε να syncχρονομετρήστε αυτόν τον επιλεγμένο κώδικα Java.

SyncΟι κλειδαριές χρονομετρημένης μεθόδου έχουν πρόσβαση στη μέθοδο, ενώ syncΟι κλειδαριές χρονομέτρων μπλοκ είναι προσβάσιμες στο αντικείμενο.

class MathService {
    void getSumOfArray(int[] numbers) {
        synchronized (this){
            int sum = 0;

            for (int number : numbers) {
                System.out.println(Thread.currentThread()
                        .getName()
                        + " adds "
                        + sum + " to "
                        + number + " to get -> "
                        + (sum += number));

                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        }
    }
}
public class Synchronization {
    public static void main(String[] args) {
        MathService mathService = new MathService();

        Thread threadOne = new Thread(() ->
                mathService.getSumOfArray(new int[]{10, 11, 12}));
        Thread threadTwo = new Thread(() ->
                mathService.getSumOfArray(new int[]{20, 21, 22}));

        threadOne.start();
        threadTwo.start();
    }
}

Επεξήγηση κώδικα:

Με την εκτέλεση αυτού του κωδικού, θα παρατηρήσετε ότι λειτουργεί χωρίς παρεμβολές.

Στο syncχρονισμένη μέθοδο, η κλειδαριά εφαρμόζεται με τη μέθοδο, αλλά στο syncχρονισμένο μπλοκ, η κλειδαριά εφαρμόζεται από το αντικείμενο.

Βεβαιωθείτε ότι η έξοδος είναι όπως φαίνεται παρακάτω.

Παραγωγή:

Thread-0 adds 0 to 10 to get -> 10
Thread-0 adds 10 to 11 to get -> 21
Thread-0 adds 21 to 12 to get -> 33
Thread-1 adds 0 to 20 to get -> 20
Thread-1 adds 20 to 21 to get -> 41
Thread-1 adds 41 to 22 to get -> 63

Επεξήγηση κωδικού:

Όταν εκτελείτε αυτόν τον κωδικό, θα σημειώσετε ότι λειτουργεί χωρίς παρεμβολές, κάτι που περιμέναμε. Στο syncχρονισμένη μέθοδο, η κλειδαριά εφαρμόζεται με τη μέθοδο, αλλά στο syncΗ μέθοδος του χρονισμένου μπλοκ, η κλειδαριά εφαρμόζεται από το αντικείμενο.

Χρησιμοποιώντας στατικό syncχρονισμός

Σε Java syncΧρονισμός, εάν υπάρχουν περισσότερα από ένα αντικείμενα, δύο νήματα μπορεί να αποκτήσουν τις κλειδαριές και να εισέλθουν σε syncχρονομετρημένο μπλοκ ή μπλοκ, με ξεχωριστή κλειδαριά για κάθε αντικείμενο. Για να αποφευχθεί αυτό, στατική syncμπορεί να χρησιμοποιηθεί χρονισμός.

Syncθα χρησιμοποιηθούν συγχρονισμένες λέξεις-κλειδιά πριν από τις στατικές μεθόδους.

Σημείωση: Στατικά syncΧρονισμός, η πρόσβαση κλειδώματος είναι στην κλάση, όχι στο αντικείμενο και τη μέθοδο.

Κώδικας για την επίδειξη του προβλήματος του κλειδώματος πολλαπλών αντικειμένων

class MathService {
    synchronized void getSumOfArray(int[] numbers) {
            int sum = 0;

            for (int number : numbers) {
                System.out.println(Thread.currentThread()
                        .getName()
                        + " adds "
                        + sum + " to "
                        + number + " to get -> "
                        + (sum += number));

                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
    }
}
public class Synchronization {
    public static void main(String[] args) {
        MathService mathService = new MathService();
        MathService mathService1 = new MathService();

        Thread threadOne = new Thread(() ->
                mathService.getSumOfArray(new int[]{10, 11, 12}));
        Thread threadTwo = new Thread(() ->
                mathService.getSumOfArray(new int[]{20, 21, 22}));
        Thread threadThree = new Thread(() ->
                mathService1.getSumOfArray(new int[]{10, 11, 12}));
        Thread threadFour = new Thread(() ->
                mathService1.getSumOfArray(new int[]{20, 21, 22}));

        threadOne.start();
        threadTwo.start();
        threadThree.start();
        threadFour.start();
    }
}

Επεξήγηση κωδικού:

Όταν δημιουργούμε μια άλλη παρουσία του 'MathService', εισάγουμε παρεμβολές στα νήματα καθώς θα παρεμβάλλονται με τα δύο αντικείμενα. Σημειώστε ότι το νήμα «0» και το νήμα «2» παρεμβάλλονται με τα δύο αντικείμενα, ενώ το νήμα «1» και «3» παρεμβάλλονται με τα δύο αντικείμενα.

Παραγωγή:

Thread-0 adds 0 to 10 to get -> 10
Thread-2 adds 0 to 10 to get -> 10
Thread-0 adds 10 to 11 to get -> 21
Thread-2 adds 10 to 11 to get -> 21
Thread-0 adds 21 to 12 to get -> 33
Thread-2 adds 21 to 12 to get -> 33
Thread-1 adds 0 to 20 to get -> 20
Thread-3 adds 0 to 20 to get -> 20
Thread-1 adds 20 to 21 to get -> 41
Thread-3 adds 20 to 21 to get -> 41
Thread-1 adds 41 to 22 to get -> 63
Thread-3 adds 41 to 22 to get -> 63

Χρησιμοποιώντας τον ίδιο κωδικό syncσυγχρονισμένη στατική μέθοδος

class MathService {
    synchronized static void getSumOfArray(int[] numbers) {
            int sum = 0;

            for (int number : numbers) {
                System.out.println(Thread.currentThread()
                        .getName()
                        + " adds "
                        + sum + " to "
                        + number + " to get -> "
                        + (sum += number));

                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
    }
}
public class Synchronization {
    public static void main(String[] args) {
        MathService mathService = new MathService();
        MathService mathService1 = new MathService();

        Thread threadOne = new Thread(() ->
                mathService.getSumOfArray(new int[]{10, 11, 12}));
        Thread threadTwo = new Thread(() ->
                mathService.getSumOfArray(new int[]{20, 21, 22}));
        Thread threadThree = new Thread(() ->
                mathService1.getSumOfArray(new int[]{10, 11, 12}));
        Thread threadFour = new Thread(() ->
                mathService1.getSumOfArray(new int[]{20, 21, 22}));

        threadOne.start();
        threadTwo.start();
        threadThree.start();
        threadFour.start();
    }
}

Εκτελέστε τον παραπάνω κώδικα και σημειώστε ότι έχουμε πλέον εξαλείψει τις παρεμβολές νημάτων. Η έξοδος του κώδικα φαίνεται παρακάτω.

Παραγωγή:

Thread-0 adds 0 to 10 to get -> 10
Thread-0 adds 10 to 11 to get -> 21
Thread-0 adds 21 to 12 to get -> 33
Thread-3 adds 0 to 20 to get -> 20
Thread-3 adds 20 to 21 to get -> 41
Thread-3 adds 41 to 22 to get -> 63
Thread-2 adds 0 to 10 to get -> 10
Thread-2 adds 10 to 11 to get -> 21
Thread-2 adds 21 to 12 to get -> 33
Thread-1 adds 0 to 20 to get -> 20
Thread-1 adds 20 to 21 to get -> 41
Thread-1 adds 41 to 22 to get -> 63

Πλεονεκτήματα της χρήσης syncχρονισμός

Ακολουθούν τα πλεονεκτήματα κατά την εργασία με ταυτόχρονες εφαρμογές:

  • Ο κύριος στόχος του syncΤο hronization στην Java είναι η αποτροπή ασυνεπών δεδομένων αποτρέποντας παρεμβολές νημάτων.
  • Η syncΗ συγχρονισμένη λέξη-κλειδί στην Java παρέχει κλείδωμα, το οποίο εξασφαλίζει αμοιβαία αποκλειστική πρόσβαση στον κοινόχρηστο πόρο και αποτρέπει τον αγώνα δεδομένων.
  • Αποτρέπει επίσης την αναδιάταξη των δηλώσεων κώδικα από το μεταγλωττιστής, το οποίο μπορεί να προκαλέσει ένα διακριτικό ταυτόχρονο πρόβλημα, εάν δεν χρησιμοποιήσουμε πτητικό ή syncχρονομετρημένες λέξεις-κλειδιά.
  • SyncΗ συγχρονισμένη λέξη-κλειδί διαβάζει δεδομένα από την κύρια μνήμη από την προσωρινή μνήμη και όταν απελευθερώνει το κλείδωμα.
  • Επίσης ξεπλένει τη γραφή operaαπό την κύρια μνήμη, εξαλείφοντας τα σφάλματα ασυνέπειας της μνήμης.

Μειονεκτήματα του SyncΜηχανισμός Χρονισμού

SyncΧρονισμός Οι μηχανισμοί έχουν κακή απόδοση.

Για παράδειγμα

  • Ας υποθέσουμε ότι υπάρχουν πέντε διαδικασίες, A1, A2, A3, A4 και A5.
  • Περιμένουν τους κοινόχρηστους πόρους να έχουν πρόσβαση σε ένα νήμα τη φορά.
  • Όλες οι διεργασίες παραμένουν σε αναμονή, επομένως η τελευταία στην ουρά πρέπει να περιμένει μέχρι να ολοκληρωθούν όλες οι άλλες διεργασίες.

Χαρακτηριστικά

  • SyncΤο hronization αναφέρεται στην ικανότητα ελέγχου της πρόσβασης πολλαπλών νημάτων σε οποιονδήποτε κοινόχρηστο πόρο.
  • Η Java έχει δύο τύπους syncμέθοδοι χρονισμού: 1) Διαδικασία syncχρονισμός και 2) Νήμα syncχρονισμός.
  • Το κλείδωμα στην Java είναι χτισμένο γύρω από μια εσωτερική οντότητα γνωστή ως οθόνη ή κλειδαριά.
  • Ένα πρόγραμμα πολλαπλών νημάτων είναι μια μέθοδος ή μπλοκ που προστατεύεται από παρεμβολές από άλλα νήματα που μοιράζονται τον ίδιο πόρο που υποδεικνύεται χρησιμοποιώντας το «syncλέξη-κλειδί «χρονισμένη».
  • Οποιαδήποτε μέθοδος δηλώνεται ως syncη χρονική είναι γνωστή ως α syncσυγχρονισμένη μέθοδος.
  • Στην Ιάβα, syncΟι κλειδαριές χρονομετρημένης μεθόδου έχουν πρόσβαση στη μέθοδο, ενώ syncΟι κλειδαριές χρονομέτρων μπλοκ είναι προσβάσιμες στο αντικείμενο.
  • Στατικά syncΧρονισμός, η πρόσβαση κλειδώματος είναι στην κλάση, όχι στο αντικείμενο και τη μέθοδο.
  • Ο κύριος στόχος του syncΤο hronization στην Java είναι η αποτροπή ασυνεπών δεδομένων αποτρέποντας παρεμβολές νημάτων.
  • Το μεγαλύτερο μειονέκτημα αυτής της μεθόδου είναι ότι όλες οι διεργασίες διατηρούνται σε αναμονή, επομένως οι τελευταίες στην ουρά πρέπει να περιμένουν μέχρι να ολοκληρωθούν όλες οι άλλες διεργασίες.