Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package ReadersWriters;
- import ReadersWriters.MemorySegment;
- import ReadersWriters.MemoryWrapper;
- import ReadersWriters.Process;
- public class SolutionWithSynchronization implements MemoryWrapper{
- private MemorySegment _memory = null;
- private boolean writing;
- private int readers = 0;
- public SolutionWithSynchronization(){
- _memory = new MemorySegment();
- }
- public void read(Process p){
- p.setState("wantread");
- beforeRead();
- p.setState("reading");
- _memory.read();
- p.setState("idle");
- afterRead();
- }
- public void write(Process p){
- p.setState("wantwrite");
- beforeWrite();
- p.setState("writing");
- _memory.write();
- p.setState("idle");
- afterWrite();
- }
- private synchronized void beforeRead() {
- while(!okToRead()){
- try {
- wait();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- readers++;
- }
- public boolean okToRead(){
- return !writing;
- }
- private synchronized void beforeWrite() {
- while(!okToWrite())
- try {
- wait();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- writing = true;
- }
- public boolean okToWrite(){
- return !writing && readers == 0;
- }
- private synchronized void afterRead() {
- readers--;
- notifyAll();
- }
- private synchronized void afterWrite() {
- writing = false;
- notifyAll();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement