SynchronousQueue
是一种非常特殊的队列 - 它在 接口后面实现了一种交会方法(生产者等到消费者准备好,消费者等到生产者准备好)。Queue
因此,您可能仅在需要该特定语义的特殊情况下才需要它,例如,单线程任务而不排队进一步的请求。
使用的另一个原因是性能。的实现似乎经过了大量优化,因此,如果您不需要比集合点更多的内容(例如,在“按需”创建使用者的情况下,以便队列项不会累积),则可以通过使用 获得性能提升。SynchronousQueue
SynchronousQueue
Executors.newCachedThreadPool()
SynchronousQueue
简单的综合测试表明,在一个简单的单生产者-单消费者场景中,双核机器的吞吐量比吞吐量高出约20倍,并且队列长度=1。当队列长度增加时,它们的吞吐量会上升,几乎达到 吞吐量。这意味着与其他队列相比,多核计算机上的同步开销较低。但同样,只有在特定情况下,当您需要伪装成 的会合点时,它才重要。SynchronousQueue
LinkedBlockingQueue
ArrayBlockingQueue
SynchronousQueue
SynchronousQueue
Queue
编辑:
这是一个测试:
public class Test {
static ExecutorService e = Executors.newFixedThreadPool(2);
static int N = 1000000;
public static void main(String[] args) throws Exception {
for (int i = 0; i < 10; i++) {
int length = (i == 0) ? 1 : i * 5;
System.out.print(length + "\t");
System.out.print(doTest(new LinkedBlockingQueue<Integer>(length), N) + "\t");
System.out.print(doTest(new ArrayBlockingQueue<Integer>(length), N) + "\t");
System.out.print(doTest(new SynchronousQueue<Integer>(), N));
System.out.println();
}
e.shutdown();
}
private static long doTest(final BlockingQueue<Integer> q, final int n) throws Exception {
long t = System.nanoTime();
e.submit(new Runnable() {
public void run() {
for (int i = 0; i < n; i++)
try { q.put(i); } catch (InterruptedException ex) {}
}
});
Long r = e.submit(new Callable<Long>() {
public Long call() {
long sum = 0;
for (int i = 0; i < n; i++)
try { sum += q.take(); } catch (InterruptedException ex) {}
return sum;
}
}).get();
t = System.nanoTime() - t;
return (long)(1000000000.0 * N / t); // Throughput, items/sec
}
}
这是我的机器上的结果: