SynchronousQueue

2020-11-13  本文已影响0人  From64KB

在谈SynchronousQueue之前,先来回顾下 ArrayBlockingQueue 还记得怎么样自己实现一个 ArrayBlockingQueue吗?忘记的话,见这里
可以通过ArrayBlockingQueue 来认识SynchronousQueue。有两个线程Thread-1Thread-2分别构成生产者和消费者,如果使用ArrayBlockingQueue 来作为两者沟通的桥梁的话,可以分为以下几种情况:

  1. ArrayBlockingQueue为空 ,Thread-2想要获取item,此时Thread-2被block住
  2. Thread-1ArrayBlockingQueue增加item,Thread-2获取item,都不会发生block
  3. ArrayBlockingQueue已满, Thread-1想要继续增加item,此时Thread-1会被block住

如果是SynchronousQueue来作为两者沟通的桥梁呢?
1.SynchronousQueue为空,Thread-2想要获取item,此时Thread-2被block住

  1. Thread-1SynchronousQueue添加item, Thread-1被block住,直到Thread-2来取走item

不难看出SynchronousQueue并不会存储item,添加item的线程在item被取走之前会被block住。很多说法是说SynchronousQueue会存储一个item,这是不准确的,SynchronousQueue会block住添加的线程,然后直接把这个item交给获取的线程(hand-off)。

上一篇下一篇

猜你喜欢

热点阅读