多个线程并行地将元素添加到同一队列,其他线程消耗其中的元素。
在下面的示例中使用LinkedList
时,队列将以serveral null值结尾,并且大小为常数。无论请求/consumer
多少次,队列仍然具有空值且大小不为零。
所以我将Linkedlist
更改为ConcurrentLinkedQueue
,问题消失了。这似乎是线程安全的问题。
queue
如何具有null元素?为什么queue.poll()
无法轮询队列中的null
元素?
示例:
@RestController
@RequestMapping("/v1")
public class SendController {
public static Queue<String> queue = new ConcurrentLinkedQueue<>();//ok
public static Queue<String> queue = new LinkedList<>();//will have null value in it and can't poll from it
@GetMapping(value = "/produce")
public String pro() {
String s = UUID.randomUUID().toString();
queue.add(s);
return "true";
}
@GetMapping(value = "/consume")
public String con() {
if(queue.size() == 0) {
return null;
}
return queue.poll();
}
答案 0 :(得分:0)
如果队列为空,则轮询方法返回null,它也可以轮询null元素。为什么null元素进入队列,这很奇怪
包装测试;
import java.util.LinkedList;
public class TestLL {
public static void main(String[] args) {
// TODO Auto-generated method stub
LinkedList<String> ll = new LinkedList<>();
System.out.println(ll.poll());
System.out.println(ll.size());
String s = "abc";
ll.add(s);
s = null;
ll.add("cde");
ll.add("efg");
System.out.println(ll.size());
String pollStr = ll.poll();
System.out.println("pollStr=" + pollStr);
System.out.println(ll.size());
System.out.println(ll.poll());
System.out.println(ll.poll());
System.out.println(ll.poll());
System.out.println(ll.poll());
System.out.println();
ll.add(null);
System.out.println(ll.size());
System.out.println(ll.poll());
System.out.println(ll.size());
}
}