title: Which concurrent Queue implementation should I use in Java?
body: <p>From the JavaDocs:</p>
  
  <ul>
  <li>A <a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ConcurrentLinkedQueue.html" rel="noreferrer">ConcurrentLinkedQueue</a> is an appropriate choice when many threads will share access to a common collection. This queue does not permit null elements.</li>
  <li><a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ArrayBlockingQueue.html" rel="noreferrer">ArrayBlockingQueue</a> is a classic "bounded buffer", in which a fixed-sized array holds elements inserted by producers and extracted by consumers. This class supports an optional fairness policy for ordering waiting producer and consumer threads</li>
  <li><a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/LinkedBlockingQueue.html" rel="noreferrer">LinkedBlockingQueue</a> typically have higher throughput than array-based queues but less predictable performance in most concurrent applications.</li>
  </ul>
  
  <p>I have 2 scenarios, one requires the queue to support many producers (threads using it) with one consumer and the other is the other way around.</p>
  
  <p>I do not understand which implementation to use. Can somebody explain what the differences are?</p>
  
  <p>Also, what is the 'optional fairness policy' in the <code>ArrayBlockingQueue</code>?</p>