От критики данного стека отойду, предположим что он не блокирующийся и правильно реализован.
Потоки, работающие со стеком не блокируются при добавлении и получении очередного элемента, но это не отменяет того, что стек надо проверять не единожды (может быть не совсем точно выражаюсь), т.е. на момент, когда поток производит извлечение из стека, то он забирает все, что на данный момент там есть, а остальное в очередной раз при выборке.
Возвращаясь к вашему вопросу: добавлю, что что-то будет добавлено после return null — и так будет — и вообще в любом месте может быть добавлено, ибо неблокирующийся. Выборка из стека будет давать то, что есть на данный момент.
"Не волнуйся, голова! Теперь будет думать компьютер"
Гомер Джей Симпсон