当前位置: 代码迷 >> 综合 >> Java Queue的奇怪阻塞问题
  详细解决方案

Java Queue的奇怪阻塞问题

热度:52   发布时间:2024-02-02 16:04:05.0

在实际项目中,出现了一个关于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()两方法自己封装加同步锁后,该问题不出现了。

各位大神,帮忙讲讲其中道理,看现象并不存在两个线程同时取队列中元素,为什么会发生阻塞,一直没有想明白