SynchronousQueue 是最特别的 BlockingQueue:它没有存储。这篇用真实运行量出它的语义、它在线程池里的效果、公平与非公平的取走顺序,以及直接交接的代价。
remainingCapacity() = 0,size() = 0,isEmpty() = true
没有消费者时 offer("a") = false,poll() = null,peek() = null
offer("a", 200 ms) = false,耗时约 209 ms
poll(200 ms) = null,耗时约 210 ms
生产者已阻塞 300 ms:size() = 0,peek() = null,iterator().hasNext() = false,线程状态 WAITING
生产者 put("x") 在 320 ms 后返回
消费者 take() 取到 x
消费者还没来时 offer("direct") = false
已有消费者在 take() 等待时 offer("y") = true50 个阻塞任务同时提交:池里线程数 50,队列元素数 0,队列类型 SynchronousQueue 任务结束后空闲线程仍有 50 个(60 秒内不回收) ThreadPoolExecutor(2, 4, SynchronousQueue):连续提交 10 个阻塞任务,接受 4 个、拒绝 6 个(第 5 个任务被拒绝)
fair = true:先后到达的生产者 1..5 被取走的顺序 [1, 2, 3, 4, 5] fair = false:先后到达的生产者 1..5 被取走的顺序 [5, 4, 3, 2, 1]
SynchronousQueue 每个对象约 2598 ns(中位数,共 5196 ms) SynchronousQueue(fair) 每个对象约 2397 ns(中位数,共 4793 ms) ArrayBlockingQueue(1) 每个对象约 4976 ns(中位数,共 9951 ms) ArrayBlockingQueue(1024) 每个对象约 123 ns(中位数,共 246 ms) LinkedBlockingQueue 每个对象约 139 ns(中位数,共 277 ms)