несколько потоков добавляют элементы в одну и ту же очередь параллельно, а другие потоки потребляют элементы в ней.
Когда я использую 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();
}