在实际项目中,出现了一个关于queue的奇怪问题
程序逻辑:声明了一个Queue对象,暴露出restful接口,可调用接口内部执行queue.offer()存入元素
有定时任务,定时调用queue.poll()取出5000个元素,写入本地文件
有问题的代码段,没有放源代码就是表述大概意思
Set set = new HashSet();
for(int i=0;i<5000;i++){
Object o = queue.poll();
if(0!=null){
set.add(o);
}
}
//下面就是把set集合写成文件
出现问题:在服务器上部署后,set集合每次都不足5000元素,诊断为queue.poll()无法取出对象。
但下一次执行定时任务时,又能取出几百个元素。
根据日志显示,两次定时任务应该没有存在交叉,并发的情况,但接口是会被一直调用存入元素。
将poll()、offer()两方法自己封装加同步锁后,该问题不出现了。
各位大神,帮忙讲讲其中道理,看现象并不存在两个线程同时取队列中元素,为什么会发生阻塞,一直没有想明白