java:thread_signalling

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
Next revision Both sides next revision
java:thread_signalling [2015/04/19 15:08]
gthanos [Συγχρονισμός Νημάτων]
java:thread_signalling [2015/04/19 15:22]
gthanos [Συγχρονισμός με χρήση wait(), notify(), notifyAll()]
Line 1: Line 1:
 ====== Συγχρονισμός Νημάτων ====== ====== Συγχρονισμός Νημάτων ======
  
-Ο συγχρονισμός νημάτων έχει σαν στόχο να επιτρέπει σε διαφορετικά νήματα να διαβάζουν ή να γράφουν με ασφάλεια σε διαμοιραζόμενες μεταβλητές χωρίς να προκύπτουν ασάφειες ως προς τις τιμές των μεταβλητών αυτών λόγω ταυτόχρονης μεταβολής τους. Ο προσεκτικός αναγνώστης θα παρατηρήσει ότι το παραπάνω μπορούμε να το επιτύχουμε και με την χρήση συγχρονισμένων μπλοκ ή συγχρονισμένων μεθόδων. Το παραπάνω είναι σωστό με την εξής όμως διαφορά.+Ο συγχρονισμός νημάτων έχει σαν στόχο να επιτρέπει σε διαφορετικά νήματα να διαβάζουν ή να γράφουν με ασφάλεια σε διαμοιραζόμενες μεταβλητές χωρίς να προκύπτουν ασάφειες ως προς τις τιμές των μεταβλητών αυτών λόγω ταυτόχρονης μεταβολής τους. Ο προσεκτικός αναγνώστης θα παρατηρήσει ότι το παραπάνω μπορούμε να το επιτύχουμε και με την χρήση συγχρονισμένων μπλοκ ή συγχρονισμένων μεθόδων. Το παραπάνω είναι ​εν μέρη ​σωστόμόνο αν τα νήματα δύναται να εκτελούνται παράλληλα. Εάν τα νήματα δεν μπορούν να εκτελεστούν παράλληλα,​ αλλά το ένα νήμα θα πρέπει να περιμένει το άλλο να ολοκληρώσει τότε τα συγχρονισμένα block από μόνα τους δεν αποτελούν λύση. Σε αυτή την περίπτωση απαιτείται η έννοια της κλειδαριάς (lock)
  
 Ας υποθέσουμε ότι έχουμε δύο νήματα Α, Β και το νήμα Α θέλει να ειδοποιήσει το νήμα Β μόλις ολοκληρώσει την επεξεργασία των δεδομένων του, ώστε εκείνο να ξεκινήσει την επεξεργασία των δεδομένων που δημιουργήθηκαν. Δεν μας αρκεί δηλαδή τα νήματα Α, Β να εκτελούνται παράλληλα,​ αλλά θα θέλαμε το Β να ξεκινήσει την επεξεργασία μόλις το Α ολοκληρώσει. Ας υποθέσουμε ότι έχουμε δύο νήματα Α, Β και το νήμα Α θέλει να ειδοποιήσει το νήμα Β μόλις ολοκληρώσει την επεξεργασία των δεδομένων του, ώστε εκείνο να ξεκινήσει την επεξεργασία των δεδομένων που δημιουργήθηκαν. Δεν μας αρκεί δηλαδή τα νήματα Α, Β να εκτελούνται παράλληλα,​ αλλά θα θέλαμε το Β να ξεκινήσει την επεξεργασία μόλις το Α ολοκληρώσει.
Line 123: Line 123:
 Εκτός της //​notify()//​ υπάρχει και η //​notifyAll()//​ που ξυπνάει όλα τα νήματα που περιμένουν στο συγκεκριμένο //monitor lock// σε αντίθεση με την notify() που ξυπνάει μόνο ένα νήμα. Όταν περισσότερα του ενός νήματα περιμένουν το ποιο νήμα θα ξυπνήσει η μέθοδος //​notify()//​ δεν ελέγχεται από εσάς. Είστε όμως σίγουροι ότι θα ξυπνήσει ένα νήμα. Εκτός της //​notify()//​ υπάρχει και η //​notifyAll()//​ που ξυπνάει όλα τα νήματα που περιμένουν στο συγκεκριμένο //monitor lock// σε αντίθεση με την notify() που ξυπνάει μόνο ένα νήμα. Όταν περισσότερα του ενός νήματα περιμένουν το ποιο νήμα θα ξυπνήσει η μέθοδος //​notify()//​ δεν ελέγχεται από εσάς. Είστε όμως σίγουροι ότι θα ξυπνήσει ένα νήμα.
  
-<​WRAP ​tip 80% round center>+<​WRAP ​important ​80% round center>
 Ο παραπάνω κώδικας δεν μπορεί να εξασφαλίσει τον συγχρονισμό αν αντικαταστήσουμε την notify() με την notifyAll(). Γιατί; Ο παραπάνω κώδικας δεν μπορεί να εξασφαλίσει τον συγχρονισμό αν αντικαταστήσουμε την notify() με την notifyAll(). Γιατί;
 </​WRAP>​ </​WRAP>​
java/thread_signalling.txt · Last modified: 2016/02/26 11:15 (external edit)