10月28,K神开讲数据科学:AB Test/实验设计


一亩三分地论坛

 找回密码
 Sign Up 注册获取更多干货
天天打游戏、照样领工资、还办H1B
这份工作你要不要?
把贵司招聘信息放这里
查看: 2308|回复: 8
收起左侧

常考题,blocking queue

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

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

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

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

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

  2.         private List queue = new LinkedList();
  3.         private int limit = 10;

  4.         public BlockingQueue(int limit) {
  5.                 this.limit = limit;
  6.         }

  7.         public synchronized void enqueue(Object item) throws InterruptedException {. From 1point 3acres bbs
  8.                 while (this.queue.size() == this.limit) {
  9.                         wait();. 涓浜-涓夊垎-鍦帮紝鐙鍙戝竷
  10.                 } 鏉ユ簮涓浜.涓夊垎鍦拌鍧.
  11.                 if (this.queue.size() == 0) {
  12.                         notifyAll();
  13.                 }. 1point3acres.com/bbs
  14.                 this.queue.add(item);  //I think this is wrong. From 1point 3acres bbs
  15.         }

  16.         public synchronized Object dequeue() throws InterruptedException {
  17.                 while (this.queue.size() == 0) {
  18.                         wait();
  19.                 }.鐣欏璁哄潧-涓浜-涓夊垎鍦
  20.                 if (this.queue.size() == this.limit) {
  21.                         notifyAll();
  22.                 }
  23.                 return this.queue.remove(0);
  24.         }. 鐣欏鐢宠璁哄潧-涓浜╀笁鍒嗗湴
  25. }
复制代码
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循环中,是 ...

嗯, 不好意思,我前面的回复是错的。应该是在加入新的元素后,然后再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
我有个地方不太明白哈,求问一下。
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
回复 支持 反对

使用道具 举报

本版积分规则

关闭

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

手机版|小黑屋|一亩三分地论坛声明

custom counter

GMT+8, 2017-10-23 07:08

Powered by Discuz! X3

© 2001-2013 Comsenz Inc. Design By HUXTeam

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