/**
   * Save the state of the <tt>ConcurrentHashMap</tt> instance to a stream (i.e., serialize it).
   *
   * @param s the stream
   * @serialData the key (Object) and value (Object) for each key-value mapping, followed by a null
   *     pair. The key-value mappings are emitted in no particular order.
   */
  private void writeObject(java.io.ObjectOutputStream s) throws IOException {
    s.defaultWriteObject();

    for (int k = 0; k < segments.length; ++k) {
      Segment<K, V> seg = (Segment<K, V>) segments[k];
      seg.lock();
      try {
        HashEntry[] tab = seg.table;
        for (int i = 0; i < tab.length; ++i) {
          for (HashEntry<K, V> e = (HashEntry<K, V>) tab[i]; e != null; e = e.next) {
            s.writeObject(e.key);
            s.writeObject(e.value);
          }
        }
      } finally {
        seg.unlock();
      }
    }
    s.writeObject(null);
    s.writeObject(null);
  }
 /**
  * Save the state to a stream (that is, serialize it).
  *
  * @param s the stream
  */
 private void writeObject(java.io.ObjectOutputStream s) throws java.io.IOException {
   boolean fair = transferer instanceof TransferQueue;
   if (fair) {
     qlock = new ReentrantLock(true);
     waitingProducers = new FifoWaitQueue();
     waitingConsumers = new FifoWaitQueue();
   } else {
     qlock = new ReentrantLock();
     waitingProducers = new LifoWaitQueue();
     waitingConsumers = new LifoWaitQueue();
   }
   s.defaultWriteObject();
 }