Advertisement
Guest User

Untitled

a guest
Jul 23rd, 2017
52
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5 1.44 KB | None | 0 0
  1. package ReadersWriters;
  2.  
  3. import ReadersWriters.MemorySegment;
  4. import ReadersWriters.MemoryWrapper;
  5. import ReadersWriters.Process;
  6.  
  7. public class SolutionWithSynchronization implements MemoryWrapper{
  8.  
  9.     private MemorySegment _memory = null;
  10.     private boolean writing;
  11.     private int readers = 0;
  12.    
  13.     public SolutionWithSynchronization(){
  14.     _memory = new MemorySegment();
  15.     }
  16.  
  17.     public void read(Process p){
  18.         p.setState("wantread");
  19.         beforeRead();
  20.         p.setState("reading");
  21.         _memory.read();
  22.         p.setState("idle");
  23.         afterRead();
  24.     }
  25.    
  26.     public void write(Process p){
  27.         p.setState("wantwrite");
  28.         beforeWrite();
  29.         p.setState("writing");
  30.         _memory.write();
  31.         p.setState("idle");
  32.         afterWrite();
  33.     }
  34.    
  35.     private synchronized void beforeRead() {
  36.         while(!okToRead()){
  37.             try {
  38.                 wait();
  39.             } catch (InterruptedException e) {
  40.                 e.printStackTrace();
  41.             }
  42.         }
  43.         readers++;
  44.     }
  45.    
  46.     public boolean okToRead(){
  47.         return !writing;
  48.     }
  49.  
  50.     private synchronized void beforeWrite() {
  51.         while(!okToWrite())
  52.             try {
  53.                 wait();
  54.             } catch (InterruptedException e) {
  55.                 e.printStackTrace();
  56.             }
  57.         writing = true;
  58.     }
  59.  
  60.     public boolean okToWrite(){
  61.         return !writing && readers == 0;
  62.     }
  63.    
  64.     private synchronized void afterRead() {
  65.         readers--;
  66.         notifyAll();
  67.        
  68.     }
  69.    
  70.     private synchronized void afterWrite() {
  71.         writing = false;
  72.         notifyAll();
  73.     }
  74. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement