| Both sides previous revision
Previous revision
Next revision
|
Previous revision
Next revision
Both sides next revision
|
java:java_util_concurrent [2017/03/21 11:59] gthanos [Υλοποίηση μίας διασυνδεδεμένης λίστας η οποία είναι συγχρονισμένη] |
java:java_util_concurrent [2017/03/21 12:30] gthanos [Atomic Integer, Long, Boolean, Reference] |
| Το παραπάνω interface υλοποιείται μεσω της κλάσης [[http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/ReentrantReadWriteLock.html||java.util.concurrent.locks.ReentrantReadWriteLock]]. Η κλάση αυτή περιέχει δύο άλλες εσωτερικές κλάσεις την [[http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/ReentrantReadWriteLock.ReadLock.html|ReentrantReadWriteLock.ReadLock]] και [[http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/ReentrantReadWriteLock.WriteLock.html|ReentrantReadWriteLock.WriteLock]]. Η πρώτη χρησιμοποιείται για διάβασμα και η δεύτερη για γράψιμο. | Το παραπάνω interface υλοποιείται μεσω της κλάσης [[http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/ReentrantReadWriteLock.html||java.util.concurrent.locks.ReentrantReadWriteLock]]. Η κλάση αυτή περιέχει δύο άλλες εσωτερικές κλάσεις την [[http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/ReentrantReadWriteLock.ReadLock.html|ReentrantReadWriteLock.ReadLock]] και [[http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/ReentrantReadWriteLock.WriteLock.html|ReentrantReadWriteLock.WriteLock]]. Η πρώτη χρησιμοποιείται για διάβασμα και η δεύτερη για γράψιμο. |
| ===== Atomic Integer, Long, Boolean, Reference ===== | ===== Atomic Integer, Long, Boolean, Reference ===== |
| | |
| | Στο πακέτο [[https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/atomic/package-summary.html|java.util.concurrent.atomic]] η γλώσσα παρέχει ισοδύναμους των βασικών τύπων δεδομένων οι οποίοι όμως μπορούν να προσπελαστούν από δύο ή περισσότερα νήματα χωρίς να προκύψει ασάφεια ως προς την τιμή τους. Οι τύποι αυτοί είναι οι εξής: |
| | |
| | * [[https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/atomic/AtomicBoolean.html|AtomicBoolean:]] Μία boolean μεταβλητή η οποία μπορεί να αλλάξει τιμή ατομικά. |
| | * [[https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/atomic/AtomicInteger.htmlAtomicInteger:]] Μία Integer μεταβλητή η οποία μπορεί να αλλάξει τιμή ατομικά. |
| | * [[https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/atomic/AtomicIntegerArray.html|AtomicIntegerArray:]] Ένας πίνακας από ακεραίους του οποίου τα στοιχεία μπορούν να αλλάξουν τιμή ατομικά. |
| | * [[https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/atomic/AtomicLong.html|AtomicLong:]] Μία Long μεταβλητή η οποία μπορεί να αλλάξει τιμή ατομικά. |
| | * [[https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/atomic/AtomicLongArray.html|AtomicLongArray:]] Ένας πίνακας από ακεραίους τύπου Long του οποίου τα στοιχεία μπορούν να αλλάξουν τιμή ατομικά. |
| | * [[https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/atomic/AtomicReference.html|AtomicReference:]] Μία αναφορά σε αντικείμενο η οποία μπορεί να αλλάξει ατομικά. |
| | * [[https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/atomic/AtomicReferenceArray.html|AtomicReferenceArray:]] Ένας πίνακας από αναφορές του οποίου τα στοιχεία μπορούν να αλλάξουν τιμή ατομικά. |
| | |
| | Οι βασικές μέθοδοι που διαθέτουν οι παραπάνω κλάσεις είναι οι εξής: |
| | * **compareAndSet:** Η μέθοδος αλλάζει την τιμή της μεταβλητής με την προϋπόθεση ότι η υφιστάμενη τιμή ταυτίζεται με το 1ο όρισμα της μεθόδου. |
| | * **get:** Επιστρέφει την τρέχουσα τιμή. |
| | * **getAndSet:** Επιστρέφει την υφιστάμενη τιμή και την ανανεώνει με μία νέα. |
| | * **lazySet:** Θέτει μία νέα τιμή για την μεταβλητή. |
| | * **set:** Θέτει μία νέα τιμή για την μεταβλητή. |
| | |
| |
| ===== Παραδείγματα Χρήσης Εργαλείων Συγχρονισμού ===== | ===== Παραδείγματα Χρήσης Εργαλείων Συγχρονισμού ===== |
| Random rand; | Random rand; |
| SynchronizedList<Integer> list; | SynchronizedList<Integer> list; |
| | //ArrayList<Integer> list; |
| | |
| public ListModifierThread(SynchronizedList<Integer> list) { | public ListModifierThread(SynchronizedList<Integer> list) { |
| | //public ListModifierThread(ArrayList<Integer> list) { |
| this.list = list; | this.list = list; |
| rand = new Random( new Date().getTime() ); | rand = new Random( new Date().getTime() ); |
| list.add( rand.nextInt(1000) ); | list.add( rand.nextInt(1000) ); |
| | |
| list.listWriteLock(); | for(int i=0; i<1000; i++) |
| while( list.size() > 0 ) | list.remove(0); |
| System.out.println( list.remove( list.size()-1 ) ); | |
| | |
| if( list.isEmpty() ) | if( list.isEmpty() ) |
| else | else |
| System.out.println( this.getName() +": list is NOT empty!"); | System.out.println( this.getName() +": list is NOT empty!"); |
| list.listWriteUnlock(); | |
| } | } |
| } | } |
| public static void main(String []args) { | public static void main(String []args) { |
| SynchronizedList<Integer> list = new SynchronizedList<>(); | SynchronizedList<Integer> list = new SynchronizedList<>(); |
| | //ArrayList<Integer> list = new ArrayList<>(); |
| | |
| for(int i=0; i<10; i++) { | for(int i=0; i<10; i++) { |