This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision Next revision Both sides next revision | ||
|
java:java_util_concurrent [2017/03/21 11:15] gthanos [Lock] |
java:java_util_concurrent [2017/03/21 12:13] gthanos [Υλοποίηση μίας διασυνδεδεμένης λίστας η οποία είναι συγχρονισμένη] |
||
|---|---|---|---|
| Line 11: | Line 11: | ||
| Ένα //blocking queue// είναι μία ουρά μηνυμάτων (//queue//) στην οποία μπορούν να γράφουν ή να διαβάζουν από αυτή με ασφάλεια δύο ή περισσότερα νήματα. Όταν η ουρά είναι άδεια και ένα νήμα επιχειρήσει να διαβάσει αυτό μπλοκάρει μέχρι κάποιο άλλο νήμα να γράψει στην ουρά. Αντίστοιχα, | Ένα //blocking queue// είναι μία ουρά μηνυμάτων (//queue//) στην οποία μπορούν να γράφουν ή να διαβάζουν από αυτή με ασφάλεια δύο ή περισσότερα νήματα. Όταν η ουρά είναι άδεια και ένα νήμα επιχειρήσει να διαβάσει αυτό μπλοκάρει μέχρι κάποιο άλλο νήμα να γράψει στην ουρά. Αντίστοιχα, | ||
| - | {{ :java:design_and_implement_a_blocking_queue-600x0.png?450 | + | |
| + | {{ :java:blockingqueue.png? }} | ||
| Οι βασικές μέθοδοι που υποστηρίζονται από ένα //blocking queue// είναι οι εξής: | Οι βασικές μέθοδοι που υποστηρίζονται από ένα //blocking queue// είναι οι εξής: | ||
| Line 66: | Line 67: | ||
| ===== ReadWriteLock ===== | ===== ReadWriteLock ===== | ||
| - | Αντίστοιχα με τo interface | + | Το //interface// [[https:// |
| + | ReadWriteLock]] | ||
| - | * ΜΟΝΟ ένα νήμα μπορεί να γράψει. | + | * ΜΟΝΟ ένα νήμα μπορεί να γράψει. Κανένα νήμα δεν μπορεί να διαβάσει. |
| * Πολλαπλά νήματα μπορούν να διαβάσουν εάν δεν υπάρχει νήμα που θέλει να γράψει. | * Πολλαπλά νήματα μπορούν να διαβάσουν εάν δεν υπάρχει νήμα που θέλει να γράψει. | ||
| Line 76: | Line 78: | ||
| ===== Παραδείγματα Χρήσης Εργαλείων Συγχρονισμού ===== | ===== Παραδείγματα Χρήσης Εργαλείων Συγχρονισμού ===== | ||
| - | ==== Blocking Queue με locks ==== | + | ===== Blocking Queue με Locks ===== |
| Ας υποθέσουμε ότι έχετε το αρχείο κειμένου {{: | Ας υποθέσουμε ότι έχετε το αρχείο κειμένου {{: | ||
| - | Για την επικοινωνία μεταξύ αναγνωστών και εγγραφέων θα χρησιμοποιηθεί ένα blocking queue με σχετικά περιορισμένη χωρητικότητα **Κ**, όπου **K < min(M,N)**. Επίσης για την υλοποίηση του συγχρονισμού διαθέτουμε δύο κλειδαριές **α)** μία κλειδαριά η οποία βεβαιώνει ότι μόνο ένα νήμα | + | Για την επικοινωνία μεταξύ αναγνωστών και εγγραφέων θα χρησιμοποιηθεί ένα blocking queue με σχετικά περιορισμένη χωρητικότητα **Κ**, όπου **K < min(M,N)**. Επίσης για την υλοποίηση του συγχρονισμού διαθέτουμε δύο κλειδαριές **α)** μία κλειδαριά η οποία βεβαιώνει ότι μόνο ένα νήμα |
| - | Δείτε | + | <WRAP tip 80% center round> |
| + | Για | ||
| + | </ | ||
| - | <code java UtilConcurrentDemo1.java> | + | <code java BlockingQueueWithLocks.java> |
| import java.util.concurrent.*; | import java.util.concurrent.*; | ||
| import java.util.concurrent.locks.*; | import java.util.concurrent.locks.*; | ||
| import java.io.*; | import java.io.*; | ||
| - | public class UtilConcurrentDemo1 | + | public class BlockingQueueWithLocks |
| | | ||
| public static void main(String args[]) { | public static void main(String args[]) { | ||
| Line 109: | Line 113: | ||
| } | } | ||
| | | ||
| - | boolean useLocks = false; | + | boolean useLocks = true; |
| | | ||
| ArrayBlockingQueue< | ArrayBlockingQueue< | ||
| Line 253: | Line 257: | ||
| ==== Υλοποίηση μίας διασυνδεδεμένης λίστας η οποία είναι συγχρονισμένη ==== | ==== Υλοποίηση μίας διασυνδεδεμένης λίστας η οποία είναι συγχρονισμένη ==== | ||
| - | Όπως ίσως θα γνωρίζετε η διασυνδεδεμένες λίστες που υπάρχουν στο πακέτο java.util δεν είναι συγχρονισμένες, | + | Όπως ίσως θα γνωρίζετε η διασυνδεδεμένες λίστες που υπάρχουν στο πακέτο |
| Δείτε πως διαμορφώνεται η κλάση καθώς και ένα παράδειγμα χρήσης της κλάσης αυτής. | Δείτε πως διαμορφώνεται η κλάση καθώς και ένα παράδειγμα χρήσης της κλάσης αυτής. | ||
| - | <code java UtilConcurrentDemo2.java> | + | <code java SynchronizedList.java> |
| import java.util.*; | import java.util.*; | ||
| import java.util.concurrent.*; | import java.util.concurrent.*; | ||
| Line 428: | Line 432: | ||
| Random rand; | Random rand; | ||
| SynchronizedList< | SynchronizedList< | ||
| + | // | ||
| | | ||
| public ListModifierThread(SynchronizedList< | public ListModifierThread(SynchronizedList< | ||
| + | //public ListModifierThread(ArrayList< | ||
| this.list = list; | this.list = list; | ||
| rand = new Random( new Date().getTime() ); | rand = new Random( new Date().getTime() ); | ||
| Line 438: | Line 444: | ||
| list.add( rand.nextInt(1000) ); | list.add( rand.nextInt(1000) ); | ||
| - | | + | |
| - | while( list.size() > 0 ) | + | list.remove(0); |
| - | | + | |
| | | ||
| if( list.isEmpty() ) | if( list.isEmpty() ) | ||
| Line 446: | Line 451: | ||
| else | else | ||
| System.out.println( this.getName() +": list is NOT empty!" | System.out.println( this.getName() +": list is NOT empty!" | ||
| - | list.listWriteUnlock(); | ||
| } | } | ||
| } | } | ||
| Line 453: | Line 457: | ||
| public static void main(String []args) { | public static void main(String []args) { | ||
| SynchronizedList< | SynchronizedList< | ||
| + | // | ||
| | | ||
| for(int i=0; i<10; i++) { | for(int i=0; i<10; i++) { | ||