生产者消费者模式,观察者模式,工作者模式小结

1.生产者消费者模式

设计要点是 tray

  1. 生产者,消费者都要将对应的托盘对应为实例域

  2. 托盘的核心是一个DataQueue,但是tray并不直接将DataQueue的add和remove方法暴露给生产者消费者,而是 通过get()和put()方法。

  3. get()和put()方法内部通过synchronized保护;内部通过while- wait - notify机制实现高效的轮流占有tray。注意是while而不是if, 因为可能有众多的生产者消费者,某个消费者得到了锁并不一定意味此时DataQueue不为空(可能是被其他消费者notify后得到锁,也可能是在得到锁前put的Data已经先被其他消费者获取了),因此还要再次判断DataQueue是否为空。

  4. while - wait - notify
    如果生产者和消费者都使用 while - wait - notify模式,那么必须

    0 <= 生产者produce的data数 - 消费者consmue的data数 <= 托盘总容量

    否则总会一方处于wait状态(没有被notify)而导致程序无法结束。

  5. 对while - wait - notify的改进
    OO第二单元作业电梯调度,可以将Input进程视为Producer,但是由于不能预先知道Producer产生的请求指令数(因此生产者消费者内部不再采用for循环计数,而是采用while循环),因此如果直接使用while-wait-notify可能会导致程序无法结束。

    改进
    方法1. 采用 if (空) - sleep - else - DataQueue.remove , 但是我再另一篇文章中有说,需要设置标志位将sleep移出监控区,否则会导致效率极低。

    方法2. 采用if(空) - wait - else - DataQueue.remove(相比之前while之后一定会执行remove操作,在这里为空就不执行remove了)。但是需要控制好结束消费者循环的条件

2.观察者模式

3.工作者模式

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值