Dzok1517

AtomiciPisciCitaoci

Jan 11th, 2021 (edited)
44
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.59 KB | None | 0 0
  1. package djolepokusavaatomike;
  2.  
  3. import java.util.concurrent.atomic.AtomicInteger;
  4.  
  5. import os.simulation.Application;
  6. import os.simulation.AutoCreate;
  7. import os.simulation.Container;
  8. import os.simulation.Item;
  9. import os.simulation.Operation;
  10. import os.simulation.Thread;
  11.  
  12. /*
  13.  * Data je zajednicka baza podataka. Vise procesa zeli da istovremeno pristupa
  14.  * ovoj bazi kako bi citali ili upisivali podatke u nju. Kako bi korektno
  15.  * realizovali ove istovremene pristupe bez rizika da dodje do problema,
  16.  * procesi moraju da postuju sledeca pravila: istovremena citanja su dozvoljena
  17.  * posto citaoci ne smetaju jedan drugom, istovremeno citanje i pisanje nije
  18.  * dozvoljeno jer se moze desiti da citalac procita pogresne podatke (do pola
  19.  * upisane), istovremena pisanja takodje nisu dozvoljena jer mogu prouzrokovati
  20.  * ostecenje podataka.
  21.  *
  22.  * Implementirati sinhronizaciju procesa pisaca i procesa citalaca tako da se
  23.  * postuju opisana pravila.
  24.  */
  25. public class PristupAtomici extends Application{
  26.    
  27.     public class Pristup{
  28.        
  29.         private AtomicInteger brP = new AtomicInteger(0);
  30.         private AtomicInteger brC = new AtomicInteger(0);
  31.        
  32.         private final int MAX  = 5;
  33.        
  34.         private void zapocniPisanje() {
  35.            
  36.             boolean ok;
  37.             do {
  38.                 int oldValue = brP.get();
  39.                
  40.                 ok = oldValue  == 0;
  41.                 if(ok) {
  42.                     ok = brP.compareAndSet(oldValue, 1);
  43.                 }
  44.                
  45.             }while(!ok);
  46.            
  47.         }  
  48.         private void zavrsiPisanje() {
  49.             boolean ok;
  50.             do {
  51.                 int oldValue =  brP.get();
  52.                     ok = brP.compareAndSet(oldValue, 0);   
  53.             }while(!ok);
  54.         }
  55.        
  56.         private void zapocniCitanje() {
  57.            
  58.             boolean ok;
  59.             do {
  60.                 int oldValue = brP.get();
  61.                
  62.                 ok = oldValue == 0 || oldValue ==2;
  63.                 if(ok) {
  64.                     ok = brP.compareAndSet(oldValue, 2);
  65.                 }
  66.                
  67.             }while(!ok);
  68.  
  69.             do {
  70.                 int oldValue = brC.get();
  71.                 int newValue = oldValue + 1;  
  72.                 ok = newValue <= MAX;
  73.                 if(ok) {
  74.                     ok = brC.compareAndSet(oldValue, newValue);
  75.                 }      
  76.             }while(!ok);   
  77.         }
  78.        
  79.         private void zavrsiCitanje() {
  80.             boolean poslednji = false ;
  81.             boolean ok;
  82.             do {
  83.                 int oldValue = brC.get();
  84.                 int newValue = oldValue - 1;
  85.                 ok = newValue >= 0;
  86.                 if(ok) {
  87.                     ok = brC.compareAndSet(oldValue, newValue);
  88.                     if(newValue==0)
  89.                         poslednji = true;
  90.                 }
  91.                
  92.             }while(!ok);
  93.            
  94.             if(poslednji)
  95.                 brP.set(0);
  96.         }
  97.  
  98.        
  99.     }
  100.    
  101.     private Pristup pristup = new Pristup();
  102.  
  103.     @AutoCreate(2)
  104.     protected class Pisac extends Thread {
  105.  
  106.         @Override
  107.         protected void step() {
  108.             radiNestoDrugo();
  109.             pristup.zapocniPisanje();
  110.             pise();
  111.             pristup.zavrsiPisanje();
  112.         }
  113.     }
  114.  
  115.     @AutoCreate(5)
  116.     protected class Citalac extends Thread {
  117.  
  118.         @Override
  119.         protected void step() {
  120.             radiNestoDrugo();
  121.             pristup.zapocniCitanje();
  122.             cita();
  123.             pristup.zavrsiCitanje();
  124.         }
  125.     }
  126.  
  127.     // ------------------- //
  128.     //    Sistemski deo    //
  129.     // ------------------- //
  130.     // Ne dirati kod ispod //
  131.     // ------------------- //
  132.  
  133.     protected final Container pisci   = box("Писци").color(MAROON);
  134.     protected final Container citaoci = box("Читаоци").color(NAVY);
  135.     protected final Container resurs  = box("База").color(ROYAL);
  136.     protected final Container main    = column(row(pisci, citaoci), resurs);
  137.     protected final Operation pisac   = init().name("Писац %d").color(ROSE).container(pisci);
  138.     protected final Operation citalac = init().name("Читалац %d").color(AZURE).container(citaoci);
  139.     protected final Operation pisanje = duration("4±2").text("Пише").container(resurs).textAfter("Завршио").update(this::azuriraj);;
  140.     protected final Operation citanje = duration("2±2").text("Чита").container(resurs).textAfter("Завршио").update(this::azuriraj);;
  141.     protected final Operation posao   = duration("3±2").text("Ради").textAfter("Чека");
  142.  
  143.     protected void pise() {
  144.         pisanje.performUninterruptibly();
  145.     }
  146.  
  147.     protected void cita() {
  148.         citanje.performUninterruptibly();
  149.     }
  150.  
  151.     protected void radiNestoDrugo() {
  152.         posao.performUninterruptibly();
  153.     }
  154.  
  155.     protected void azuriraj(Item item) {
  156.         long brP = resurs.stream(Pisac.class).count();
  157.         long brC = resurs.stream(Citalac.class).count();
  158.         resurs.setText(String.format("%d : %d", brP, brC));
  159.         if (brP == 0 && brC == 0) {
  160.             resurs.setColor(NEUTRAL_GRAY);
  161.         } else if (brP > 0 && brC == 0) {
  162.             resurs.setColor(MAROON);
  163.         } else if (brP == 0 && brC > 0) {
  164.             resurs.setColor(NAVY);
  165.         } else {
  166.             resurs.setColor(ROYAL);
  167.         }
  168.     }
  169.  
  170.     @Override
  171.     protected void initialize() {
  172.         azuriraj(null);
  173.     }
  174.  
  175.     public static void main(String[] arguments) {
  176.         launch("Писци и читаоци");
  177.     }
  178. }
  179.  
Add Comment
Please, Sign In to add comment