一亩三分地论坛

 找回密码
 获取更多干货,去instant注册!

一亩三分地官方iOS手机应用下载
查看: 1290|回复: 8
收起左侧

常考题,blocking queue

[复制链接] |试试Instant~ |关注本帖
bobzhang2004 发表于 2016-2-19 15:10:57 | 显示全部楼层 |阅读模式

2016(1-3月) 码农类 硕士 全职@Google - Other - Onsite |Other其他

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看,没有帐号?获取更多干货,去instant注册!

x
google, uber都有考blocking queue, 我在网上找了个代码,但感觉有点问题,为什么是先notify,然后再加入呢?这样不是无法生效吗?因为notify后检查结果还是空或者还是满的?请大神指点。
  1. public class BlockingQueue {

  2.         private List queue = new LinkedList();
    .鐣欏璁哄潧-涓浜-涓夊垎鍦
  3.         private int limit = 10;. from: 1point3acres.com/bbs

  4.         public BlockingQueue(int limit) {. visit 1point3acres.com for more.
  5.                 this.limit = limit;
  6.         }

  7.         public synchronized void enqueue(Object item) throws InterruptedException {
  8.                 while (this.queue.size() == this.limit) {
  9.                         wait();. 鍥磋鎴戜滑@1point 3 acres
  10.                 }
  11.                 if (this.queue.size() == 0) {. 鐣欏鐢宠璁哄潧-涓浜╀笁鍒嗗湴
  12.                         notifyAll();
  13.                 }
  14.                 this.queue.add(item);  //I think this is wrong 鏉ユ簮涓浜.涓夊垎鍦拌鍧.
  15.         }

  16.         public synchronized Object dequeue() throws InterruptedException {
  17.                 while (this.queue.size() == 0) {.1point3acres缃
  18.                         wait();
  19.                 }
  20.                 if (this.queue.size() == this.limit) {
    鏉ユ簮涓浜.涓夊垎鍦拌鍧.
  21.                         notifyAll();
  22.                 }. 1point 3acres 璁哄潧
  23.                 return this.queue.remove(0);
  24.         }
  25. }
复制代码
beefcurtain5 发表于 2016-2-19 16:27:41 | 显示全部楼层
关注一亩三分地公众号:
Warald_一亩三分地
小弟们, java 是个open source language, 网上有的查java class的source code。。。 just google “grepcode BlockingQueue”
回复 支持 反对

使用道具 举报

lotustree86 发表于 2016-2-19 16:59:08 | 显示全部楼层
关注一亩三分地微博:
Warald
在这里是无所谓的,因为只要你没有从synchronized 函数中返回,你还是持有lock的,其它waiting thread是不会被wake up的,notify 只是把waiting thread从waiting queue放到ready queue,要真正wake up需要拿到lock才行。
回复 支持 反对

使用道具 举报

 楼主| bobzhang2004 发表于 2016-2-19 23:00:21 | 显示全部楼层
lotustree86 发表于 2016-2-19 16:59
在这里是无所谓的,因为只要你没有从synchronized 函数中返回,你还是持有lock的,其它waiting thread是不 ...

这里如果wake up以后,queue还没有加入元素,那样wake up的线程又会被block吧,因为还在while循环中,是不是应该先加元素,最后notifyAll呢?
回复 支持 反对

使用道具 举报

lotustree86 发表于 2016-2-20 09:05:07 | 显示全部楼层
bobzhang2004 发表于 2016-2-19 23:00. more info on 1point3acres.com
这里如果wake up以后,queue还没有加入元素,那样wake up的线程又会被block吧,因为还在while循环中,是 ...

嗯, 不好意思,我前面的回复是错的。应该是在加入新的元素后,然后再notify.
求职神器indeed - 在全球最大的求职网站找找适合你的工作?
回复 支持 反对

使用道具 举报

xiaoniqiuqiu 发表于 2016-3-5 15:35:31 | 显示全部楼层
我有个地方不太明白哈,求问一下。
if (this.queue.size() == 0) {
     notifyAll();
}
为什么是空的时候notify all呢?
不是空的时候就不notify all嘛?
回复 支持 反对

使用道具 举报

 楼主| bobzhang2004 发表于 2016-3-5 23:50:58 | 显示全部楼层
xiaoniqiuqiu 发表于 2016-3-5 15:35
我有个地方不太明白哈,求问一下。
if (this.queue.size() == 0) {
     notifyAll();

因为要唤醒要dequeue的线程
回复 支持 反对

使用道具 举报

xiaoniqiuqiu 发表于 2016-3-6 16:14:46 | 显示全部楼层
bobzhang2004 发表于 2016-3-5 23:50
因为要唤醒要dequeue的线程

queue是空的时候唤醒dequeue的线程?
回复 支持 反对

使用道具 举报

newbiee 发表于 2016-4-11 11:12:18 | 显示全部楼层
恩,我感觉逻辑是有点问题,producer自己notifyAll() 自己, 我找了个代码,好像更加合理一些  http://stackoverflow.com/a/2537117/3288836
回复 支持 反对

使用道具 举报

本版积分规则

请点这里访问我们的新网站:一亩三分地Instant.

Instant搜索更强大,不扣积分,内容组织的更好更整洁!目前仍在beta版本,努力完善中!反馈请点这里

关闭

一亩三分地推荐上一条 /5 下一条

手机版|小黑屋|一亩三分地论坛声明 ( 沪ICP备11015994号 )

custom counter

GMT+8, 2017-2-28 01:12

Powered by Discuz! X3

© 2001-2013 Comsenz Inc. Design By HUXTeam

快速回复 返回顶部 返回列表