code: public void publish() {
          /*
           * Some care is required here to correctly swap the DataBuffers,
           * but not hold the synchronization object while compiling stats
           * (a potentially long computation).  This ensures that continued
           * data collection (calls to noteValue()) will not be blocked for any
           * significant period.
           */
          DataBuffer tmp = null;
          Lock l = null;
          synchronized (swapLock) {
              // Swap buffers
              tmp = current;
              current = previous;
              previous = tmp;
              // Start collection in the new "current" buffer
              l = current.getLock();
              l.lock();
              try {
                  current.startCollection();
              } finally {
                  l.unlock();
              }
              // Grab lock on new "previous" buffer
              l = tmp.getLock();
              l.lock();
          }
          // Release synchronizaton *before* publishing data
          try {
              tmp.endCollection();
              publish(tmp);
          } finally {
              l.unlock();
          }
      }
docs: Swaps the data collection buffers, and computes statistics
  about the data collected up til now.