Τα προγράμματα πολλαπλών νημάτων ενδέχεται να παρουσιάζονται τακτικά με περιστάσεις όπου πολλαπλές προσπαθήστε να φτάσετε στον ίδιο πόρο που παράγει δόλια και εκπληκτικά αποτελέσματα. Αυτό μπορεί να επιλυθεί χρησιμοποιώντας το συγχρονισμό σε Java. Μόνο ένα συγκεκριμένο νήμα μπορεί να φτάσει στον πόρο σε έναν δεδομένο σκοπό του χρόνου. Αυτό το άρθρο θα σας βοηθήσει να εξοικειωθείτε με τη στρατηγική συγχρονισμού.
Θα συζητήσω τα θέματα με αυτήν τη σειρά:
- Γιατί να χρησιμοποιήσετε το συγχρονισμό στην Java;
- Τύποι συγχρονισμού
- Κλειδαριές στην Ιάβα
- Multi-threading χωρίς συγχρονισμό
- Multi-threading με συγχρονισμό
- Συγχρονισμένη λέξη-κλειδί
- Διαφορά μεταξύ συγχρονισμένης λέξης-κλειδιού και συγχρονισμένου μπλοκ
Ας αρχίσουμε!
Γιατί να χρησιμοποιήσετε το συγχρονισμό στην Java;
περάστε από την τιμή και περάστε από το java αναφοράς
Εάν ξεκινήσετε με τουλάχιστον δύο νήματα μέσα σε ένα πρόγραμμα, ενδέχεται να υπάρχει πιθανότητα πολλά νήματα να προσπαθήσουν να φτάσουν στον ίδιο πόρο. Μπορεί ακόμη και να δημιουργήσει ένα απροσδόκητο αποτέλεσμα λόγω προβλημάτων ταυτότητας.
Σύνταξη :
συγχρονισμένος (αντικείμενο προσδιοριστής) {// Πρόσβαση σε κοινόχρηστες μεταβλητές και άλλους κοινόχρηστους πόρους}
Για παράδειγμα, προσπάθεια εγγραφής σε ένα αντίστοιχο αρχείο. Αυτό μπορεί να καταστρέψει τα δεδομένα καθώς ένα από τα νήματα μπορεί να παρακάμψει τα δεδομένα ή όταν ένα νήμα ανοίγει τοίδιο αρχείο ταυτόχρονα, ένα άλλο νήμα μπορεί να κλείνει το ίδιο αρχείο.Υπάρχει ανάγκη συγχρονισμού της δράσης πολλαπλών νημάτων. Αυτό μπορεί να εφαρμοστεί χρησιμοποιώντας μια ιδέα που ονομάζεται Μ παρατηρητές .
- Καθε σχετίζεται με μια οθόνη, την οποία μπορεί να κλειδώσει ή να ξεκλειδώσει ένα νήμα.
- Μόνο ένα νήμα τη φορά μπορεί να κρατάει κλειδαριά στην οθόνη.
- Ιάβα Η γλώσσα προγραμματισμού παρέχει έναν πολύ βολικό τρόπο δημιουργίας νημάτων και συγχρονισμού της εργασίας τους χρησιμοποιώντας το Συγχρονισμένη μπλοκ.
- Διατηρεί επίσης τους κοινόχρηστους πόρους σε αυτό το συγκεκριμένο μπλοκ.
Τα συγχρονισμένα μπλοκ στην Java επισημαίνονται με το Συγχρονισμένη λέξη-κλειδί. Αυτό το μπλοκ στην Java συγχρονίζεται σε κάποιο αντικείμενο.Όλα τα μπλοκ που συγχρονίζονται στο ίδιο αντικείμενο μπορούν να έχουν μόνο ένα νήμα που εκτελείται μέσα τους κάθε φορά. Όλα τα άλλα νήματα που προσπαθούν να εισέλθουν στο συγχρονισμένο μπλοκ αποκλείονται έως ότου το νήμα μέσα στο συγχρονισμένο μπλοκ βγαίνει από το μπλοκ.
Τύποι συγχρονισμού
Υπάρχουν βασικά δύο τύποι συγχρονισμού. Αυτοί είναι:
- Συγχρονισμός διαδικασίας: Η ταυτόχρονη εκτέλεση πολλαπλών νημάτων ή διαδικασιών για την επίτευξη μιας κατάστασης έτσι ώστε να δεσμεύονται σε μια συγκεκριμένη ακολουθία ενεργειών.
- Συγχρονισμός νημάτων: Σε στιγμές που περισσότερα από ένα νήματαπροσπαθεί να αποκτήσει πρόσβαση σε έναν κοινόχρηστο πόρο, πρέπει να διασφαλίσετε ότι ο πόρος θα χρησιμοποιηθεί από μόνο ένα νήμα στομια στιγμή.
Ας μην μπαίνουμε στις λεπτομέρειες αυτών των τύπων και προσπαθήστε να καταλάβουμε τι είναι κλειδαριές .
Κλειδαριές στην Ιάβα
Όπως ανέφερα νωρίτερα, ο συγχρονισμός βασίζεται σε μια εσωτερική οντότητα γνωστή ως κλειδαριά ή οθόνη . Κάθε αντικείμενο έχει μια κλειδαριά που σχετίζεται με αυτό. Έτσι, ένα νήμα που χρειάζεται συνεπή πρόσβαση στα πεδία ενός αντικειμένου πρέπει να αποκτήσει το κλείδωμα του αντικειμένου πριν από την πρόσβαση σε αυτά και στη συνέχεια να απελευθερώσει το κλείδωμα όταν ολοκληρωθεί η εργασία.
Από το Java 5, το πακέτο java.util.concurrent.locks περιέχει πολλές εφαρμογές κλειδώματος.
Έτσι φαίνεται μια κλειδαριά:
δημόσια τάξη Lock {private boolean isLocked = false public synchronized void lock () ρίχνει το InterruptException {ενώ (isLocked) {waiting ()} isLocked = true} δημόσιο συγχρονισμένο κενό ξεκλείδωμα () {isLocked = false notify ()}}
Η μέθοδος κλειδώματος () κλειδώνει την παρουσία Κλείδωμα έτσι ώστε όλα τα νήματα να κλειδώνουν το κλείδωμα () έως ότου εκτελεστεί το ξεκλείδωμα ().
Multi-threading χωρίς συγχρονισμό
Εδώ είναι ένα απλό παράδειγμα που εκτυπώνει την τιμή μετρητή σε μια ακολουθία και κάθε φορά που την εκτελούμε, παράγει ένα διαφορετικό αποτέλεσμα με βάση τη διαθεσιμότητα της CPU σε ένα νήμα. Κοίτα αυτό!
κλάση Multithread {public void printCount () {try {for (int i = 5 i<0 i--) { System.out.println('Counter --- ' + i ) } } catch (Exception e) { System.out.println('Thread interrupted.') } } } class Thread extends Multithread { private Thread t private String threadName Multithread MT Thread( String name, Multithread mt) { threadName = name MT= mt } public void run() { MT.printCount() System.out.println('Thread ' + threadName + ' exiting.') } public void start () { System.out.println('Starting ' + threadName ) if (t == null) { t = new Thread (this, threadName) t.start () } } } public class TestThread { public static void main(String args[]) { Multithread MT = new Multithread() Thread t = new Thread( 'Thread - 1 ', MT) Thread t1 = new Thread( 'Thread - 2 ', MT) t.start() t1.start() // wait for threads to end try { t.join() t1.join() } catch ( Exception e) { System.out.println('Interrupted') } } }
Το παραπάνω πρόγραμμα έχει ως αποτέλεσμα:
Multi-threading με συγχρονισμό
Αυτό είναι το ίδιο παράδειγμα όπως παραπάνω, αλλά εκτυπώνει την τιμή του μετρητή στην ακολουθία. Κάθε φορά που το τρέχουμε, παράγει το ίδιο αποτέλεσμα.
class Multithread {public void printCount () {try {for (int i = 5 i> 0 i--) {System.out.println ('Counter ---' + i)}} catch (Εξαίρεση e) {Σύστημα. out.println ('Thread interused.')}}} class Thread επεκτείνει το Multithread {private Thread t private String threadName Multithread MT Thread (String name, Multithread mt) {threadName = name MT = mt} public void run () {synchronized ( MT) {MT.printCount ()} System.out.println ('Thread' + threadName + 'exiting.')} Δημόσια άκυρη εκκίνηση () {System.out.println ('Start' + threadName) εάν (t == null) {t = new Thread (this, threadName) t.start ()}}} δημόσια τάξη TestThread {public static void main (String args []) {Multithread MT = new Multithread () Thread T = new Thread ('Thread - 1 ', MT) Thread T1 = νέο Thread (' Thread - 2 ', MT) T.start () T1.start () // περιμένετε να τελειώσει το νήμα δοκιμάστε {T.join () T1.join ()} catch (Εξαίρεση ε) {System.out.println ('Interrupt')}}}
Η έξοδος απεικονίζεται παρακάτω:
Συγχρονισμένη λέξη-κλειδί
τι είναι χαλαρή σύζευξη σε java
συγχρονισμένη λέξη-κλειδί επισημαίνει ένα μπλοκ ή μια μέθοδο μια κρίσιμη ενότητα. Μια κρίσιμη ενότητα είναι όπου εκτελείται μόνο ένα νήμα κάθε φορά, και το νήμα κρατά το κλείδωμα για τη συγχρονισμένη ενότητα. Αυτό συγχρονισμένος η λέξη-κλειδί βοηθάει γραπτώς ταυτόχρονος μέρη οποιασδήποτε εφαρμογής. Προστατεύει επίσης τους κοινόχρηστους πόρους εντός του μπλοκ.
Η συγχρονισμένη λέξη-κλειδί μπορεί να χρησιμοποιηθεί με:
Ας συζητήσουμε το μπλοκ κώδικα.
Συγχρονισμένη λέξη-κλειδί: Ένα μπλοκ κώδικα
Σύνταξη
Η γενική σύνταξη για τη σύνταξη ενός συγχρονισμένου μπλοκ είναι:
συγχρονισμένο (lockObject) {// συγχρονισμένες δηλώσεις}
Όταν ένα νήμα θέλει να εκτελέσει τις συγχρονισμένες δηλώσεις μέσα στο μπλοκ, πρέπει να αποκτήσει το κλείδωμα στην οθόνη του lockObject. Μόνο ένα νήμα μπορεί να αποκτήσει την οθόνη ενός αντικειμένου κλειδώματος κάθε φορά. Επομένως, όλα τα άλλα νήματα πρέπει να περιμένουν μέχρι το νήμα που εκτελείται αυτήν τη στιγμή να αποκτήσει το κλείδωμα και να ολοκληρώσει την εκτέλεση του.
Με αυτόν τον τρόπο, το συγχρονισμένος Η λέξη-κλειδί εγγυάται ότι μόνο ένα νήμα θα εκτελεί τις συγχρονισμένες δηλώσεις μπλοκ κάθε φορά και έτσι εμποδίζει πολλά νήματα να καταστρέψουν τα κοινόχρηστα δεδομένα που υπάρχουν μέσα στο μπλοκ.
Σημείωση :
- Εάν ένα νήμα τεθεί σε αναστολή (χρησιμοποιώντας
ύπνος()
μέθοδος) τότε δεν απελευθερώνει την κλειδαριά. Κατά τη διάρκεια αυτού του χρόνου ύπνου, κανένα νήμα δεν θα εκτελεί τις συγχρονισμένες δηλώσεις μπλοκ. - Ο συγχρονισμός Java θα ρίξει NullPointerException εάν το αντικείμενο κλειδώματος χρησιμοποιείται στο συγχρονισμένο (κλείδωμα) «Είναι μηδενικό.
Τώρα, ας συζητήσουμε τη μέθοδο.
Συγχρονισμένη λέξη-κλειδί: Μια μέθοδος
Σύνταξη
Η γενική σύνταξη για τη σύνταξη α συγχρονισμένη μέθοδος είναι:
συγχρονισμένη μέθοδος (παράμετροι) {// συγχρονισμένος κώδικας}
Εδώ lockObject είναι απλώς μια αναφορά σε ένα αντικείμενο του οποίου το κλείδωμα σχετίζεται με την οθόνη που αντιπροσωπεύει τις συγχρονισμένες δηλώσεις.
Παρόμοια με το συγχρονισμένο μπλοκ, ένα νήμα πρέπει να αποκτήσει το κλείδωμα στο συνδεδεμένο αντικείμενο οθόνης με τη συγχρονισμένη μέθοδο. Στην περίπτωση της συγχρονισμένης μεθόδου, το αντικείμενο κλειδώματος είναι:
- Αντικείμενο «.class» - εάν η δεδομένη μέθοδος είναι στατικός .
- «Αυτό» αντικείμενο - εάν η μέθοδος είναι μη στατικό . «Αυτό» είναι η αναφορά στο τρέχον αντικείμενο στο οποίο καλείται η συγχρονισμένη μέθοδος.
Η συγχρονισμένη λέξη-κλειδί Java είναι επανεισήλθε στη φύση. Αυτό σημαίνει ότι εάν μια συγχρονισμένη μέθοδος καλεί άλλη συγχρονισμένη μέθοδο που απαιτεί το ίδιο κλείδωμα, τότε το τρέχον νήμα που κρατά το κλείδωμα μπορεί να εισέλθει σε αυτήν τη μέθοδο χωρίς να αποκτήσει το κλείδωμα.
Ας προχωρήσουμε στο τελικό θέμα αυτού του άρθρου και επισημάνουμε τις σημαντικές διαφορές μεταξύ της συγχρονισμένης λέξης-κλειδιού και του μπλοκ συγχρονισμού.
πώς να ορίσετε διαδρομή για το java
Διαφορά μεταξύ συγχρονισμένης λέξης-κλειδιού και συγχρονισμένου μπλοκ
- Όταν χρησιμοποιείτε συγχρονισμένη λέξη-κλειδί με ένα μέθοδος , αποκτά μια κλειδαριά στο αντικείμενο για ολόκληρη τη μέθοδο. Αυτό σημαίνει ότι κανένα άλλο νήμα δεν μπορεί να χρησιμοποιήσει οποιαδήποτε συγχρονισμένη μέθοδο έως ότου το τρέχον νήμα που καλείται να ολοκληρώσει την εκτέλεση του.
- Συγχρονισμένη ΟΙΚΟΔΟΜΙΚΟ ΤΕΤΡΑΓΩΝΟ αποκτά μια κλειδαριά στο αντικείμενο μόνο μεταξύ παρενθέσεων μετά τον καθορισμό της συγχρονισμένης λέξης-κλειδιού. Αυτό σημαίνει ότι κανένα άλλο νήμα δεν μπορεί να αποκτήσει κλειδαριά στο ήδη κλειδωμένο αντικείμενο έως ότου βγει το μπλοκ. Αλλά άλλα νήματα θα μπορούν να έχουν πρόσβαση στον υπόλοιπο κώδικα που υπάρχει στη μέθοδο.
Αυτό μας φέρνει στο τέλος αυτού του άρθρου όπου έχουμε συζητήσει πώς ακριβώς λειτουργεί ο συγχρονισμός στην Java. Ελπίζω να είστε ξεκάθαροι με όλα όσα έχουν μοιραστεί μαζί σας σε αυτό το σεμινάριο.
Δείτε το από την Edureka, μια αξιόπιστη διαδικτυακή εταιρεία εκμάθησης με δίκτυο περισσότερων από 250.000 ικανοποιημένων μαθητών σε όλο τον κόσμο. Είμαστε εδώ για να σας βοηθήσουμε σε κάθε βήμα του ταξιδιού σας, για να γίνετε εκτός από αυτές τις ερωτήσεις της συνέντευξης java, έχουμε ένα πρόγραμμα σπουδών που έχει σχεδιαστεί για φοιτητές και επαγγελματίες που θέλουν να γίνουν προγραμματιστές Java.
Έχετε μια ερώτηση για εμάς; Παρακαλώ αναφέρετέ το στην ενότητα σχολίων αυτού του «Συγχρονισμού στην Java ' άρθρο και θα επικοινωνήσουμε μαζί σας το συντομότερο δυνατό.