자바 컬렌션 프레임워크의 Vector
와 ArrayList
를 공부하며 Vector
는 동기화(락을 걸어 현재의 스레드만 데이터에 접근할 수 있게 함)되어있지만 ArrayList
는 동기화가 되어있지 않다는걸 배웠다. 멀티스레드 환경에서 데이터의 안정성을 보장하기 위해 ArrayList
도 동기화를 시켜야될것 같은데 왜 안되어있는지 궁금하여 알아보았다.
1. Vector
와 ArrayList
의 차이점
- 동기화 (Synchronization):
Vector
: 모든 메서드가synchronized
로 선언되어 있어, 멀티쓰레드 환경에서 동시에 접근할 때도 안전하게 사용할 수 있습니다. 하지만 이러한 동기화는 성능에 영향을 미칠 수 있습니다.ArrayList
: 동기화되지 않아서 단일 쓰레드 환경에서는Vector
보다 성능이 더 우수할 수 있습니다. 멀티쓰레드 환경에서 동기화가 필요하다면, 개발자가 별도로 동기화 코드를 추가해야 합니다.
- 성능:
- **
Vector
**는 동기화 때문에 멀티쓰레드 환경에서 안전하지만, 동기화 작업이 추가로 발생하므로 성능이 떨어질 수 있습니다. - **
ArrayList
**는 동기화가 없으므로 단일 쓰레드 환경에서 더 빠르게 동작합니다. 멀티쓰레드 환경에서는 동기화를 개발자가 직접 처리해야 하지만, 이렇게 하면 필요 없는 경우에는 동기화 오버헤드를 피할 수 있습니다.
- **
2. ArrayList
가 synchronized
가 되어 있지 않은 이유
- 성능 우선:
ArrayList
는 동기화를 기본적으로 제공하지 않음으로써 성능을 우선시합니다. 많은 애플리케이션이 단일 쓰레드 환경에서 동작하거나 동기화를 수동으로 처리할 수 있는 능력을 가지고 있기 때문에, 기본적으로 동기화가 제공되지 않는 것이 더 효율적입니다. - 개발자의 선택: 개발자는 필요에 따라
Collections.synchronizedList()
메서드를 사용해ArrayList
를 동기화된 리스트로 변환할 수 있습니다. 이렇게 하면 동기화가 필요할 때만 동기화 오버헤드를 추가할 수 있습니다. - 유연성:
ArrayList
는 동기화 여부를 개발자가 제어할 수 있는 유연성을 제공합니다. 멀티쓰레드 환경이 아닌 경우에는 동기화가 없는ArrayList
를 사용하여 성능 이점을 얻을 수 있습니다.
3. 결론
ArrayList
가 기본적으로 동기화가 되어 있지 않은 것은 성능을 최적화하고 개발자에게 더 많은 유연성을 제공하기 위함입니다. 멀티쓰레드 환경에서는 Vector
를 사용하거나 ArrayList
에 동기화를 수동으로 추가하여 안전성을 확보할 수 있습니다.