Параллельно в очереди Linkedlist - PullRequest
0 голосов
/ 03 января 2019

несколько потоков добавляют элементы в одну и ту же очередь параллельно, а другие потоки потребляют элементы в ней.

Когда я использую LinkedList в приведенном ниже примере, очередь заканчивается нулевым значением в нем,и размер является постоянным значением.Независимо от того, сколько раз запрашивается /consumer, очередь по-прежнему имеет нулевое значение и размер не равен нулю.

Поэтому я изменяю Linkedlist на ConcurrentLinkedQueue и проблема исчезает.Потокобезопасная проблема.

Как queue может иметь нулевой элемент?почему 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 голосов
/ 03 января 2019

Метод опроса возвращает ноль, если очередь пуста, и он может также опрашивать нулевой элемент. Почему нулевые элементы попадают в очередь, это странно

package test;

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

}
...