📄 reader_writer.txt
字号:
/**
* 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 + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -