线程模型--读写模型(1)

本文介绍了一种复杂的并发访问控制模型——读写模型。该模型允许多个读者同时读取共享资源,但一旦有写者开始修改资源,所有读写操作都将被阻止。文章详细解释了通过信号量机制和计数器来实现这一模型的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

读写模型

读写模型是一个稍微复杂一些的模型。
一份共享资源允许多个读者同时读取。但是只要有一个写者在写这份共享资源,任何其他的读者和写者都不能访问这份共享资源。
读写模型实现起来,不仅需要信号量机制,还需要额外的读者计数和写者计数。
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(); // 通知待召队列里面的所有其他线程
}
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值