Второй подход будет работать , только если у вас есть только один поток, который может постоянно извлекать объекты из вашего стека.
Если нет, то ваша составная логика не будет работать правильно, даже если сам стек является потокобезопасным, так как другие потоки могут вставлять между вызовом empty () и вызовом pop (). Если у вас есть несколько потоков, которые могут извлекать объекты из вашего стека, вам может потребоваться сделать следующее:
synchronized (d_stackObj) { // you must use the stack object as the lock
if (!d_stackObj.empty()) {
Object obj = (Object)d_stackObj.pop();
} else {
...
}
}
Первый подход работает , даже в этом случае, поскольку он использует один атомарный вызов.