title: Implementation of BlockingQueue: What are the differences between SynchronousQueue and LinkedBlockingQueue
body: <p>I see these implementation of <strong>BlockingQueue</strong> and can't understand the differences between them. My conclusion so far:</p>
  
  <ol>
  <li>I won't ever need <strong>SynchronousQueue</strong></li>
  <li><strong>LinkedBlockingQueue</strong> ensures FIFO, <strong>BlockingQueue</strong> must be created with parameter true to make it FIFO</li>
  <li><strong>SynchronousQueue</strong> breaks most collections method (contains, size, etc)</li>
  </ol>
  
  <p>So when do I ever need <strong>SynchronousQueue</strong>? Is the performance of this implementation better than <strong>LinkedBlockingQueue</strong>?</p>
  
  <p>To make it more complicated... why does <strong>Executors.newCachedThreadPool</strong> use SynchronousQueue when the others (<strong>Executors.newSingleThreadExecutor</strong> and <strong>Executors.newFixedThreadPool</strong>) use LinkedBlockingQueue?</p>
  
  <p><em><strong>EDIT</em></strong></p>
  
  <p>The first question is solved. But I still don't understand why does <strong>Executors.newCachedThreadPool</strong> use SynchronousQueue when the others (<strong>Executors.newSingleThreadExecutor</strong> and <strong>Executors.newFixedThreadPool</strong>) use LinkedBlockingQueue? </p>
  
  <p>What I get is, with SynchronousQueue, the producer will be blocked if there is no free thread. But since the number of threads is practically unlimited (new threads will be created if needed), this will never happen. So why should it uses SynchronousQueue?</p>