идемпотентность функций правильно делать не через if (!completed.getAndSet(true)), а через if (completed.compareAndSet(false, true)), ибо первый вариант вызывает второй в цикле
if (!completed.getAndSet(true))
if (completed.compareAndSet(false, true))