读写模型
读写模型是一个稍微复杂一些的模型。
一份共享资源允许多个读者同时读取。但是只要有一个写者在写这份共享资源,任何其他的读者和写者都不能访问这份共享资源。
读写模型实现起来,不仅需要信号量机制,还需要额外的读者计数和写者计数。
public static final Object signal = new Object();
public static int readers = 0;
public static int writers = 0;
// 读者代码
… read() {
for(… ) { // 循环执行
synchronized(signal){
while( writers > 0 )
signal.wait(); // 如果有人在写,那么就放弃执行,进入待召队列
// 能够到达这里,说明没有人在写
readers ++ ; // 增加一个读者计数,表示本线程在读取
} // 这里出了synchronized范围,释放同步锁.以便其他线程读取.
// 进行一些读取操作
synchronized(signal){
readers --; // 读取完成,减少一个读者计数,表示本线程不在读取
signal.notifyAll(); // 通知待召队列里面的所有其他线程
}
}
}
// 写者代码
… write() {
for(… ) { // 循环执行
synchronized(signal){
while( writers > 0 || readers > 0)
signal.wait();// 如果有人在写或读,那么就放弃执行,进入待召队列
// 能够到达这里,说明没有人在写,也没有人在读
writers ++ ; // 增加一个写者计数,表示本线程在写
// 进行一些写操作
writers --; // 读取完成,减少一个读者计数,表示本线程不在写
signal.notifyAll(); // 通知待召队列里面的所有其他线程
}
}
}
读写模型是一个稍微复杂一些的模型。
一份共享资源允许多个读者同时读取。但是只要有一个写者在写这份共享资源,任何其他的读者和写者都不能访问这份共享资源。
读写模型实现起来,不仅需要信号量机制,还需要额外的读者计数和写者计数。
public static final Object signal = new Object();
public static int readers = 0;
public static int writers = 0;
// 读者代码
… read() {
for(… ) { // 循环执行
synchronized(signal){
while( writers > 0 )
signal.wait(); // 如果有人在写,那么就放弃执行,进入待召队列
// 能够到达这里,说明没有人在写
readers ++ ; // 增加一个读者计数,表示本线程在读取
} // 这里出了synchronized范围,释放同步锁.以便其他线程读取.
// 进行一些读取操作
synchronized(signal){
readers --; // 读取完成,减少一个读者计数,表示本线程不在读取
signal.notifyAll(); // 通知待召队列里面的所有其他线程
}
}
}
// 写者代码
… write() {
for(… ) { // 循环执行
synchronized(signal){
while( writers > 0 || readers > 0)
signal.wait();// 如果有人在写或读,那么就放弃执行,进入待召队列
// 能够到达这里,说明没有人在写,也没有人在读
writers ++ ; // 增加一个写者计数,表示本线程在写
// 进行一些写操作
writers --; // 读取完成,减少一个读者计数,表示本线程不在写
signal.notifyAll(); // 通知待召队列里面的所有其他线程
}
}
}