public final class ReadWriteLock{
private int readingReaders = 0; //实际正在读取的线程数量
private int waitingWriters = 0;//正在等待写入的线程数量
private int writingWriters = 0;//实际正在写入的线程数量
private boolean preferWriter = true;//写入优先的话,为true
public synchronized void readLock() throws InterruptedException {
while (writingWriters > 0 || (preferWriter && waitingWriters > 0)) {
wait();
}
readingReaders++;
}
public synchronized void readUnlock() {
readingReaders--;
preferWriter = true;
notifyAll();
}
public synchronized void writeLock() throws InterruptedException {
waitingWriters++;
try {
while (readingReaders > 0 || writingWriters > 0) {
wait();
}
} finally {
waitingWriters--;
}
writingWriters++;
}
public synchronized void writeUnlock() {
public synchronized void writeUnlock() {
writingWriters--;
preferWriter = false;
notifyAll();
}
}
使用方法:
lock.readLock();
try{
read();
}finally{
lock.readUnlock();
}
分清锁定的意义:
使用synchronized,可以获取实例的锁定,java程序的每个实例各有一个"锁定",同一个实例的锁定无法由两个以上的线程所获取。这是制订在java语言规格里,实现在java环境里的机制。因为是一开始就提供的功能,我们称为所谓物理性的锁定。java程序无法去改变这种锁定的行为。
而"读锁定"与"写锁定"与使用synchronized获取锁定的意义并不同,这不是java语言制订的机制,而是程序员自己实现的,这就是所谓的逻辑上的锁定。当程序员改写ReadWriteLock类时,就可以更改锁定的行为机制。