线程同步之读写者问题Java代码实现

文章介绍了读者写者问题的场景,其中数据区可由多个进程共享,读进程能同时读取,但写进程独占。代码示例使用Java的ExecutorService创建线程池模拟读写者,并通过synchronized关键字保证写操作的互斥,实现了读者优先的策略。
摘要由CSDN通过智能技术生成

读者写者问题:存在一个多个进程共享的数据区(临界资源),该数据区可以是一个文件或者一块内存空间,甚至可以是一组寄存器;有些进程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("===================================");
    }


}

运行结果: 

 

 


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值