code: public final double getAndAccumulate(double x, DoubleBinaryOperator accumulatorFunction)
      {
          double prev, next;
          do
          {
              prev = get();
              next = accumulatorFunction.applyAsDouble(prev, x);
          }
          while (!compareAndSet(prev, next));
          return prev;
      }
docs: Atomically updates the current value with the results of
  applying the given function to the current and given values,
  returning the previous value. The function should be
  side-effect-free, since it may be re-applied when attempted
  updates fail due to contention among threads.  The function
  is applied with the current value as its first argument,
  and the given update as the second argument.
  
  @param x the update value
  @param accumulatorFunction a side-effect-free function of two arguments
  @return the previous value