Java多线程_读写锁_读者写者问题

读者写者问题

读写锁

new ReentrantReadWriteLock()

  1. 读读共享
  2. 读写互斥
  3. 写写互斥

代码

public class ReadWriteLockDemo {
    static class Service {
        ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock();
        Lock readLock = readWriteLock.readLock();
        Lock writeLock = readWriteLock.writeLock();

        public void read() {
            try {
                readLock.lock(); //申请获得读锁
                System.out.printf("%s开始获得读锁,开始读取数据的时间%s ;\n", Thread.currentThread().getName(), System.currentTimeMillis());
                Thread.sleep(1000);//模拟读数据
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                System.out.printf("%s读取数据完毕的时间%s\n", Thread.currentThread().getName(), System.currentTimeMillis());
                readLock.unlock();//释放锁

            }
        }

        public void write() {
            try {
                writeLock.lock();//申请获得写锁
                System.out.printf("%s获得写锁,开始修改数据%s ;", Thread.currentThread().getName(), System.currentTimeMillis());
                Thread.sleep(5000);//模拟写数据
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                System.out.printf("%s修改数据完毕时间%s\n", Thread.currentThread().getName(), System.currentTimeMillis());
                writeLock.unlock();//释放写锁
            }
        }
    }

    static void readRead(Service service) {
        System.out.println("读读共享 测试结果:");
        //读读共享
        for (int i = 0; i < 5; i++) {
            Thread thread = new Thread(() -> service.read());
            thread.setName(String.format("readThread%d", i));
            thread.start(); //定义一个线程读数据
        }
    }

    static void writeWrite(Service service) {
        System.out.println("写写互斥 测试结果:");

        //写写互斥
        for (int j = 0; j < 5; j++) {
            Thread thread = new Thread(() -> service.write());
            thread.setName(String.format("readThread%d", j));
            thread.start();//定义一个线程写数据
        }
    }

    static void readWrite(Service service) {
        System.out.println("读写互斥 测试结果:");
        //读写互斥
        for (int k = 5; k < 10; k++) {
            Thread thread1 = new Thread(() -> service.read());
            thread1.setName(String.format("readThread%d", k));
            thread1.start(); //定义一个线程读数据
            Thread thread2 = new Thread(() -> service.write());
            thread2.setName(String.format("readThread%d", k));
            thread2.start();//定义一个线程写数据
        }
    }

    public static void main(String[] args) {
        Service service = new Service();
        //以下三个方法请单独运行
        //读读共享  result:多个读线程读取数据时间戳一致
        readRead(service);
        //写写互斥  result:写线程同时只能运行一个
        readWrite(service);
        //读写互斥  result:读写线程同时只能运行一个读线程或者写线程
        writeWrite(service);
    }
}

部分笔试题实例

该部分面试题/笔试题实例来自 @ 几到多线程笔试题,有时间练练。
例如如下面试题,以上模板可以解决面试题7;问题3-6解法 见本人前两篇文章

  • 第七题
    读者写者问题
    这也是一个非常经典的多线程题目,题目大意如下:有一个写者很多读者,多个读者可以同时读文件,但写者在写文件时不允许有读者在读文件,同样有读者读时写者也不能写。
  • 依据本例稍作改动即可
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值