在链接列表队列中并发

时间:2019-01-03 04:12:33

标签: java linked-list queue thread-safety

多个线程并行地将元素添加到同一队列,其他线程消耗其中的元素。

在下面的示例中使用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();
}

1 个答案:

答案 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());
}

}