一亩三分地论坛

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

扫码关注一亩三分地公众号
查看: 1070|回复: 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();. Waral 鍗氬鏈夋洿澶氭枃绔,
  3.         private int limit = 10;
  4. .1point3acres缃
  5.         public BlockingQueue(int limit) {
  6.                 this.limit = limit;
  7.         }

  8.         public synchronized void enqueue(Object item) throws InterruptedException {
  9.                 while (this.queue.size() == this.limit) {
  10.                         wait();
  11.                 }
  12.                 if (this.queue.size() == 0) {
  13.                         notifyAll();. from: 1point3acres.com/bbs
  14.                 }
  15.                 this.queue.add(item);  //I think this is wrong
  16.         }. 1point3acres.com/bbs

  17.         public synchronized Object dequeue() throws InterruptedException {
  18.                 while (this.queue.size() == 0) {
  19.                         wait();. more info on 1point3acres.com
  20.                 }
  21.                 if (this.queue.size() == this.limit) {
  22.                         notifyAll();
  23.                 }. from: 1point3acres.com/bbs
  24.                 return this.queue.remove(0);
  25.         }
  26. }
复制代码
beefcurtain5 发表于 2016-2-19 16:27:41 | 显示全部楼层
小弟们, java 是个open source language, 网上有的查java class的source code。。。 just google “grepcode BlockingQueue”
回复 支持 反对

使用道具 举报

lotustree86 发表于 2016-2-19 16:59:08 | 显示全部楼层
在这里是无所谓的,因为只要你没有从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. 鐣欏鐢宠璁哄潧-涓浜╀笁鍒嗗湴
这里如果wake up以后,queue还没有加入元素,那样wake up的线程又会被block吧,因为还在while循环中,是 ...
.鏈枃鍘熷垱鑷1point3acres璁哄潧
嗯, 不好意思,我前面的回复是错的。应该是在加入新的元素后,然后再notify.
回复 支持 反对

使用道具 举报

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. From 1point 3acres bbs
我有个地方不太明白哈,求问一下。. 涓浜-涓夊垎-鍦帮紝鐙鍙戝竷
if (this.queue.size() == 0) {. visit 1point3acres.com for more.
     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, 2016-12-7 23:26

Powered by Discuz! X3

© 2001-2013 Comsenz Inc. Design By HUXTeam

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