读者写者问题:存在一个多个进程共享的数据区(临界资源),该数据区可以是一个文件或者一块内存空间,甚至可以是一组寄存器;有些进程reader只读取这个数据区的数据,有些进程writer只往数据区中写数据。此外,还需要满足以下条件:
1.任意数量的读进程可以同时读这个文件。
2.一次只能有一个写进程可以写这个文件。
3.若一个写进程正在写文件,则禁止任何读进程读文件。
4.读者优先:必须等所有读进程读完才可以写。
也即是说,读进程不排斥其它读进程,而写进程排斥其它所有进程,包括读进程和写进程。
代码实现 :
1. 采用 Executors.newFixedThreadPool 模拟读写者线程。
2. 对同一个Resource的read() 不加锁,write()加类锁
public class ReaderAndWriter {
public static void main(String[] args) {
ExecutorService pool = Executors.newFixedThreadPool(5);
Resource resource = new Resource();
for (int i = 0; i < 3; i++) {
pool.submit(() -> {
resource.read();
});
}
for (int i = 0; i < 2; i++) {
pool.submit(() -> {
resource.write();
});
}
pool.shutdown();
}
}
class Resource {
public static int data = 100;
public void read() {
//暂停毫秒
try {
TimeUnit.MILLISECONDS.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
String name = Thread.currentThread().getName();
System.out.println("读者线程[" + name + "] 正在读:" + data);
System.out.println("读者线程[" + name + "] 读完了");
}
public synchronized static void write() {
//暂停毫秒
try {
TimeUnit.MILLISECONDS.sleep(80);
} catch (InterruptedException e) {
e.printStackTrace();
}
String name = Thread.currentThread().getName();
int da = new Random().nextInt(100);
System.out.println("当前数据为:" + data);
data = da;
System.out.println("写者线程[" + name + "] 正在写:" + data);
System.out.println("写者线程[" + name + "] 写完了");
System.out.println("===================================");
}
}
运行结果: