Advertisement
MarlonKuqi

SPP_TP34_exo1

Feb 28th, 2019
399
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5 1.73 KB | None | 0 0
  1. package ex1;
  2. import java.util.concurrent.locks.ReentrantReadWriteLock;;
  3.  
  4. public class MySemaphore implements SemaphoreInterface {
  5.    
  6.     private int slots;
  7.     private int waitingThreads;
  8.     private ReentrantReadWriteLock l;
  9.    
  10.     public MySemaphore() {
  11.         this.slots = 0;
  12.         this.waitingThreads = 0;
  13.         this.l = new ReentrantReadWriteLock();
  14.     }
  15.  
  16.     @Override
  17.     public synchronized void up() {
  18.         l.writeLock().lock();
  19.         slots++;
  20.         l.writeLock().unlock();
  21.        
  22.         l.readLock().lock();
  23.         int waiting = waitingThreads;
  24.         l.readLock().unlock();
  25.        
  26.         if(waiting > 0) {
  27.             l.writeLock().lock();
  28.             waitingThreads--;
  29.             l.writeLock().unlock();
  30.         }
  31.        
  32.         notify(); // Notifying thread to wake up
  33.     }
  34.  
  35.     @Override
  36.     public synchronized void down() {
  37.         l.readLock().lock();
  38.         int s = slots;
  39.         l.readLock().unlock();
  40.        
  41.         while (s == 0) {
  42.             try {
  43.                 l.writeLock().lock();
  44.                 waitingThreads++;
  45.                 l.writeLock().unlock();
  46.                
  47.                 wait(); // Blocking current thread
  48.                 } catch (InterruptedException exception) {
  49.                     exception.printStackTrace();
  50.                 }
  51.                
  52.                 l.readLock().lock();
  53.                 s = slots;
  54.                 l.readLock().unlock();
  55.             }
  56.             l.writeLock().lock();
  57.             slots--;
  58.             l.writeLock().unlock();
  59.     }
  60.  
  61.     @Override
  62.     public synchronized int releaseAll() {
  63.         l.readLock().lock();
  64.         int tmp = waitingThreads;
  65.         int waiting = waitingThreads;
  66.         l.readLock().unlock();
  67.        
  68.         while(waiting > 0) {
  69.             notify();
  70.            
  71.             l.writeLock().lock();
  72.             waiting--;
  73.             l.writeLock().unlock();
  74.         }
  75.        
  76.         l.writeLock().lock();
  77.         waitingThreads = 0;
  78.         l.writeLock().unlock();
  79.        
  80.         l.writeLock().lock();
  81.         slots += tmp;
  82.         l.writeLock().unlock();
  83.  
  84.         return tmp;
  85.     }
  86.  
  87. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement