reader_writer.txt

来自「操作系统课内实验部分」· 文本 代码 · 共 101 行

TXT
101
字号
/**
*  Sync interface
*  Sync.java
*/

public interface Sync {
    public void acquire();
    public void release();
}


/**
*  WriterPreferenceReadWriteLock class
*  WriterPreferenceReadWriteLock.java
*/

public class WriterPreferenceReadWriteLock implements ReadWriteLock {

    private long waitingReaders = 0; // threads try to read
    private long waitingWriters = 0; // threads try to write

   private long activeReaders = 0; // threads excuting read
    private long activeWriters = 0; // threads excuting write, 0 or 1

    private final ReadLock readLock = new ReadLock();
    private final WriteLock writeLock = new WriteLock();

    public Sync readLock() {
        return readLock;
    }

    public Sync writeLock() {
        return writeLock;
    }

    private class ReadLock implements Sync {
        public void acquire() {
            beforeRead();
        }

        public void release() {
            afterRead();
        }
    }

    private class WriteLock implements Sync {
        public void acquire() {
            beforeWrite();
        }

       public void release() {
            afterWrite();
        }
    }

   private synchronized void beforeRead() {
        ++waitingReaders;
        while (!canRead()) {
            try {
                wait();
            } catch (InterruptedException e) {
                --waitingReaders; // roll back state
                e.printStackTrace();
            }
        }
        --waitingReaders;         ++activeReaders;
    }

    private synchronized void afterRead() {
        --activeReaders;
        notifyAll();
    }

    private synchronized void beforeWrite() {
        ++waitingWriters;
        while (!canWrite()) {
            try {
                wait();
            } catch (InterruptedException e) {
                --waitingWriters; // roll back state
                e.printStackTrace();
            }
        }
        --waitingWriters;
        ++activeWriters;
    }

    private synchronized void afterWrite() {
        --activeWriters;
        notifyAll();
    }

    private boolean canRead() {
        return waitingWriters == 0 && activeWriters == 0;
    }

    private boolean canWrite() {
        return activeReaders == 0 && activeWriters == 0;
    }
} 

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?