public void drop() {

            _lock.lock();

            int n;
            while (true) {
                n = objects.get();

                // if we're already at zero, or have more work to do
                // it's a no-op
                if (n <= 0 || getQueueLength() > 0) {
                    _lock.unlock();
                    return;
                }
                if (objects.compareAndSet(n, n-1)) {
                    break;
                }
            }

            try {
                take(new AcquireCallback<V>() {
                        public void handleObject(V obj) {
                            destroy(obj);
                        }
                    }, true);
            } catch (RejectedExecutionException e) {
                throw new RuntimeException(e);
            } finally {
                _lock.unlock();
            }
        }