在谈SynchronousQueue
之前,先来回顾下 ArrayBlockingQueue
还记得怎么样自己实现一个 ArrayBlockingQueue
吗?忘记的话,见这里。
可以通过ArrayBlockingQueue
来认识SynchronousQueue
。有两个线程Thread-1
和Thread-2
分别构成生产者和消费者,如果使用ArrayBlockingQueue
来作为两者沟通的桥梁的话,可以分为以下几种情况:
-
ArrayBlockingQueue
为空 ,Thread-2
想要获取item,此时Thread-2
被block住 -
Thread-1
向ArrayBlockingQueue
增加item,Thread-2
获取item,都不会发生block -
ArrayBlockingQueue
已满,Thread-1
想要继续增加item,此时Thread-1
会被block住
如果是SynchronousQueue
来作为两者沟通的桥梁呢?
1.SynchronousQueue
为空,Thread-2
想要获取item,此时Thread-2
被block住
-
Thread-1
向SynchronousQueue
添加item,Thread-1
被block住,直到Thread-2
来取走item
不难看出SynchronousQueue
并不会存储item,添加item的线程在item被取走之前会被block住。很多说法是说SynchronousQueue
会存储一个item,这是不准确的,SynchronousQueue
会block住添加的线程,然后直接把这个item交给获取的线程(hand-off)。
网友评论