javadoc에서 Stack class를 찾아보면 다음과 같은 설명이 있다.
A more complete and consistent set of LIFO stack operations is provided by the Deque interface and its implementations, which should be used in preference to this class.
Stack을 사용하지 말아야하는 이유
1. Vector class를 상속받기 때문에 동일한 문제 발생
- Vector 클래스는 주요 메서드들이 각각 동기화를 진행
- 동기화를 하는 과정에서 락을 얻는 과정이 있다.
- 단일 스레드 환경에서는 락으로 인해 속도 저하 문제가 생길 수 있다.
2. 용량 설정 불가능
- ArrayDeque는 초기 Array 크기 지정 가능하나 Stack은 용량 설정이 불가능 하다.
- 따라서 큰 Stack을 자주 생성할 경우 성능이 떨어질 수 있다.
멀티 스레드에서는 ArrayDeque를 데코레이팅하거나 LinkedBlockingDeque 또는 ConcurrentLinkedDeque를 사용하자.
- LinkedBlockingDeque : 한 번에 단일 스레드에서만 데이터 접근이 가능하도록 함.
- ConcurrentLinkedDeque : 여러 스레드에서 접근이 가능하나 효율적인 lock-free 알고리즘을 사용해 우선순위가 낮은 스레드가 락을 점유하는 상황이나 데드락에 걸리는 상황을 막아줌.
단일 스레드 환경에서는 동기화를 하지 않고 스택 class를 대체할 메서드가 있는 ArrayDeque를 사용하자.
참고 자료
https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Stack.html
https://www.baeldung.com/java-lifo-thread-safe#thread_safe_impl_stack
'Java > 자료구조' 카테고리의 다른 글
시간 복잡도 기초 (0) | 2023.08.08 |
---|---|
[Deque 00] Deque란? (with 자료구조 - 선형구조) (0) | 2023.07.01 |