java:java_util_concurrent

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:java_util_concurrent [2017/03/21 11:59]
gthanos [Υλοποίηση μίας διασυνδεδεμένης λίστας η οποία είναι συγχρονισμένη]
java:java_util_concurrent [2017/03/21 12:29]
gthanos [Atomic Integer, Long, Boolean, Reference]
Line 75: Line 75:
 Το παραπάνω 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]] η γλώσσα παρέχει ισοδύναμους των βασικών τύπων δεδομένων οι οποίοι όμως μπορούν να προσπελαστούν από δύο ή περισσότερα νήματα χωρίς να προκύψει ασάφεια ως προς την τιμή τους. Οι τύποι αυτοί είναι οι εξής:
 + 
 +  * [[AtomicBoolean:]] Μία boolean μεταβλητή η οποία μπορεί να αλλάξει τιμή ατομικά.
 +  * [[AtomicInteger:]] Μία Integer μεταβλητή η οποία μπορεί να αλλάξει τιμή ατομικά.
 +  * [[AtomicIntegerArray:]] Ένας πίνακας από ακεραίους του οποίου τα στοιχεία μπορούν να αλλάξουν τιμή ατομικά.
 +  * [[AtomicLong:]] Μία Long μεταβλητή η οποία μπορεί να αλλάξει τιμή ατομικά.
 +  * [[AtomicLongArray:]] Ένας πίνακας από ακεραίους τύπου Long του οποίου τα στοιχεία μπορούν να αλλάξουν τιμή ατομικά.
 +  * [[AtomicReference:]] Μία αναφορά σε αντικείμενο η οποία μπορεί να αλλάξει ατομικά.
 +  * [[AtomicReferenceArray:]] Ένας πίνακας από αναφορές του οποίου τα στοιχεία μπορούν να αλλάξουν τιμή ατομικά.
 +
 +Οι βασικές μέθοδοι που διαθέτουν οι παραπάνω κλάσεις είναι οι εξής:
 +  * **compareAndSet:** Η μέθοδος αλλάζει την τιμή της μεταβλητής με την προϋπόθεση ότι η υφιστάμενη τιμή ταυτίζεται με το 1ο όρισμα της μεθόδου.
 +  * **get:** Επιστρέφει την τρέχουσα τιμή.
 +  * **getAndSet:** Επιστρέφει την υφιστάμενη τιμή και την ανανεώνει με μία νέα.
 +  * **lazySet:** Θέτει μία νέα τιμή για την μεταβλητή.
 +  * **set:** Θέτει μία νέα τιμή για την μεταβλητή.
 +
  
 ===== Παραδείγματα Χρήσης Εργαλείων Συγχρονισμού ===== ===== Παραδείγματα Χρήσης Εργαλείων Συγχρονισμού =====
Line 432: Line 450:
   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() );
Line 442: Line 462:
       list.add( rand.nextInt(1000) );       list.add( rand.nextInt(1000) );
    
-    list.listWriteLock()    +    for(int i=0i<1000; i++
-    while( list.size() > 0 )  +      list.remove(0);
-      System.out.println( list.remove( list.size()-1 ) );+
          
     if( list.isEmpty() )      if( list.isEmpty() ) 
Line 450: Line 469:
     else     else
       System.out.println( this.getName() +": list is NOT empty!");           System.out.println( this.getName() +": list is NOT empty!");    
-    list.listWriteUnlock(); 
   }   }
 } }
Line 457: Line 475:
   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++) {
java/java_util_concurrent.txt · Last modified: 2017/03/21 14:36 by gthanos