Advertisement
ivana_andreevska

Sinhronizacija Primer Zadaci 3

Aug 20th, 2022
897
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.81 KB | None | 0 0
  1. package AV3ZADACI;
  2.  
  3. import java.util.concurrent.Semaphore;
  4.  
  5. public class FinkiToilet {
  6.  
  7.     public static class Toilet {
  8.         //spodelen resurs ni e toalet
  9.         public void vlezi() {
  10.             System.out.println("Vleguva...");
  11.         }
  12.  
  13.         public void izlezi() {
  14.             System.out.println("Izleguva..");
  15.         }
  16.  
  17.         //inicijalizacija na semafori koi ke gi koristime
  18.         static Semaphore toiletSem;
  19.         static Semaphore mLock;//gi zaklucuva promenlivite za kolku vleguvaat vo redicite
  20.         static Semaphore zLock; //zaklucuva za kolku moze da pristapat do promenlivata so znaci cekanje vo redic
  21.  
  22.         static int numM; //redica za mazi
  23.         static int numZ; //redica za zeni
  24.  
  25.         public static void init() {
  26.             toiletSem = new Semaphore(1); //samo 1 moze da pristapi do toaletot
  27.             mLock = new Semaphore(1);
  28.             zLock = new Semaphore(1); //locks imaat po 1 privlegija vo eden moment
  29.             numM = 0;
  30.             numZ = 0;
  31.         }
  32.  
  33.  
  34.         public static class Man extends Thread {
  35.             private Toilet toilet; //spodelen resurs
  36.  
  37.             public Man(Toilet toilet) {
  38.                 this.toilet = toilet;
  39.             }
  40.  
  41.             public void enter() throws InterruptedException {
  42.                 mLock.acquire(); //dali nekoj dr ima pristap do toaletot
  43.                 //mLock e za site mazi i se dodeka ovaa promenliva ne se oslobi nemoze dr da vleze vo toaletot i da napravi povik na metodot vlezi
  44.                 //treba da proverime dali nekoj ceka vo redica za toalet
  45.                 if (numM == 0) {
  46.                     //proveruvame dali toaletot e tekovno prazen na vleguva nekoj dr slucajno i izvestuvame
  47.                     toiletSem.acquire();
  48.                 }
  49.                 //stom vleguvame vo toaletot go zgolemnuvame br na mazi so cekaat vo redica
  50.                 numM++; //site ostnati koi doagaat ke znaat deka veke nekoj e vo toaletot
  51.                 this.toilet.vlezi(); //vleguvame vo toaletot + mora ova da e sinrhonizirano so dr oti ne e atomicna operacija
  52.                 mLock.release();
  53.             }
  54.  
  55.             public void exit() {
  56.                 //se naogame vo toalet i sakame da izlzeme+sto se treba da napravime
  57.                 //mora prvo da se povika metodot izlezi
  58.                 this.toilet.izlezi();
  59.                 //promenlivata koja oznacuva cekanje vo red se namaluva
  60.                 numM--;
  61.                 //ako nemoj nikoj so ceka vo redot treba da gi izvestime zenite so cekaat od dr strana deka mozt da vlezat vo spodeleniot resurs
  62.                 //ova go pravime taka sto go oslobudvame zaednikot semafor
  63.                 if (numM == 0) {
  64.                     //ako nema nikoj red e na zenite
  65.                     toiletSem.release(); //go osloboduvame toaletot t.e zaednickot resurs za koristenje
  66.                 }
  67.                 mLock.release();
  68.             }
  69.  
  70.             public void run() {
  71.                 super.run();
  72.             }
  73.         }
  74.  
  75.         public static class Woman extends Thread {
  76.             private Toilet toilet;
  77.  
  78.             public Woman(Toilet toilet) {
  79.                 this.toilet = toilet;
  80.             }
  81.  
  82.             public void enter() throws InterruptedException {
  83.                 zLock.acquire();
  84.                 if (numZ == 0) {
  85.                     toiletSem.acquire();
  86.                 }
  87.                 numZ++;
  88.                 this.toilet.vlezi();
  89.                 zLock.release();
  90.             }
  91.  
  92.             public void exit() {
  93.                 this.toilet.izlezi();
  94.                 numZ--;
  95.                 if (numZ == 0) {
  96.                     toiletSem.release();
  97.                 }
  98.                 zLock.release();
  99.             }
  100.  
  101.             public void run() {
  102.                 super.run();
  103.             }
  104.         }
  105.     }
  106. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement