User Tools

Site Tools


java:synchronized_methods_blocks

Differences

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

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
java:synchronized_methods_blocks [2017/03/18 14:40] – [Συγχρονισμένα Βlocks] gthanosjava:synchronized_methods_blocks [2018/03/08 12:03] (current) – external edit 127.0.0.1
Line 13: Line 13:
 <code java SynchronizedCounter.java> <code java SynchronizedCounter.java>
 public class SynchronizedCounter { public class SynchronizedCounter {
-    private int c = 0;+  private int c = 0;
  
-    public synchronized void increment() { +  public synchronized void increment() { 
-        c++; +    c++; 
-    }+  }
  
-    public synchronized void decrement() { +  public synchronized void decrement() { 
-        c--; +    c--; 
-    }+  }
  
-    public synchronized int value() { +  public synchronized int value() { 
-        return c; +    return c; 
-    }+  }
 } }
 </code> </code>
  
 Αν έχουμε ένα αντικείμενο //counter// της παραπάνω κλάσης τότε ισχύουν τα παρακάτω Αν έχουμε ένα αντικείμενο //counter// της παραπάνω κλάσης τότε ισχύουν τα παρακάτω
-  * Δεν είναι δυνατόν κλήσεις συγχρονισμένων μεθόδων για το ίδιο αντικείμενο να κληθούν ταυτόχρονα από διαφορετικά νήματα. Αν υποθέσουμε ότι ένα νήμα εκτελεί μία από τις συγχρονισμένες μεθόδους ενός αντικειμένου. Όσα άλλα νήματα επιχειρούν να έχουν πρόσβαση σε συγχρονισμένες μεθόδους του ιδίου αντικειμένου, αναμένουν έως ότου το τρέχον νήμα να ολοκληρώσει την εκτέλεση της συγχρονισμένης μεθόδου την οποία εκτελεί. Αυτό διασφαλίζει ότι η αλληλουχία των κλήσεων του παραδείγματος των νημάτων A,B [[java:synchronization|που παρουσιάστηκε σε προηγούμενη σελίδα]] θα είναι η ενδεδειγμένη.+  * Δεν είναι δυνατόν η ίδια συγχρονισμένη μέθοδος ή διαφορετικές συγχρονισμένες μέθοδοι ενός αντικειμένου να κληθούν ταυτόχρονα από διαφορετικά νήματα. Ας υποθέσουμε ότι ένα νήμα εκτελεί μία από τις συγχρονισμένες μεθόδους ενός αντικειμένου. Όσα άλλα νήματα επιχειρούν να έχουν πρόσβαση σε συγχρονισμένες μεθόδους του ιδίου αντικειμένου, αναμένουν έως ότου το τρέχον νήμα να ολοκληρώσει την εκτέλεση της συγχρονισμένης μεθόδου την οποία εκτελεί και να ελευθερώσει το //monitor lock// για το αντικείμενο αυτό. Αυτό διασφαλίζει ότι η αλληλουχία των κλήσεων του παραδείγματος των νημάτων A,B [[java:synchronization|που παρουσιάστηκε σε προηγούμενη σελίδα]] θα είναι η ενδεδειγμένη.
  
 ===== Συγχρονισμένα Βlocks ===== ===== Συγχρονισμένα Βlocks =====
Line 37: Line 37:
  
 <code java> <code java>
-public void addName(String name) { +public class SynchronizedCounter { 
-    synchronized(this) { +  private int c = 0;  
-        lastName = name; +  public void increment() { synchronized (this) {c++;} }  
-        nameCount++; +  public void decrement() { synchronized (this) {c--;}  
-    +  public int value() { synchronized (this) {return c;} }
-    nameList.add(name);+
 } }
 </code> </code>
Line 57: Line 56:
     public void inc1() {     public void inc1() {
         synchronized(lock1) {         synchronized(lock1) {
-            c1++;+            while(true) { 
 +               for(long i=0; i<999999999L; i++
 +                 ; 
 +               System.out.println("Counter1: "+ ++c1); 
 +            }
         }         }
     }     }
Line 63: Line 66:
     public void inc2() {     public void inc2() {
         synchronized(lock2) {         synchronized(lock2) {
-            c2++;+            while(true) { 
 +               for(long i=0; i<999999999L; i++
 +                 ; 
 +               System.out.println("Counter2: "+ ++c2); 
 +            }
         }         }
     }     }
 +}
 +</code>
 +
 +<WRAP important 80% round center>
 +Στο παραπάνω παράδειγμα, οι μέθοδοι **inc1** και **inc2** περιέχουν δύο συγχρονισμένα blocks που κλειδώνουν από διαφορετικά αντικείμενα (**lock1** και **lock2**). Αυτό πρακτικά σημαίνει ότι οι μέθοδοι **inc1** και **inc2** μπορούν να κληθούν ταυτόχρονα από δύο διαφορετικά νήματα. Ενδεικτικό είναι το παρακάτω πρόγραμμα:
 +</WRAP>
 +
 +<code java SyncBlockThread.java>
 +public class SyncBlockThread extends Thread {
 +  SyncBlock block;
 +  boolean counter1;
 +  public SyncBlockThread(SyncBlock block, boolean counter1) {
 +    this.block = block;
 +    this.counter1 = counter1;
 +  }
 +  
 +  public void run() {
 +    if(counter1)
 +      block.inc1();
 +    else
 +      block.inc2();
 +  }
 +  
 +  public static void main(String []args) {
 +    SyncBlock block = new SyncBlock();
 +    new SyncBlockThread(block, true).start();
 +    new SyncBlockThread(block, false).start();
 +  }
 } }
 </code> </code>
Line 92: Line 127:
  
  
 +|Προηγούμενο: [[:java:thread_memory_model| Το μοντέλο μνήμης της Java ]] | [[:toc | Περιεχόμενα ]] | Επόμενο: [[java:thread_signalling | Συγχρονισμός νημάτων ]]|
  
  
java/synchronized_methods_blocks.1489848024.txt.gz · Last modified: 2017/03/18 14:40 by gthanos