티스토리 뷰
String, StringBuffer, StringBuilder의 차이에 관한 포스팅을 하면서 떠오른 클래스들이 있다.
HashMap, HashTable, ConcurrentHashMap 클래스들이다.
무슨 공통점이 있을까?
각각의 클래스들의 차이를 설명하기 위해서는 Thread-safe라는 키워드가 필요하다.
Thread-safe란 쉽게 말해서 멀티 스레드 환경에서 안정성을 보장한다는 것인데,
동기화를 지원한다고 보면 된다.
(위키를 참고했다.)
위에서 언급한 클래스들 중에서는 String, StringBuffer, HashTable, ConcurrentHashMap이 Thread-safe하다.
멀티 스레드 환경에서 동기화문제를 신경쓰지 않아도 된다.
그렇다면 StringBuilder와 HashMap은 사용할 필요가 없는 것일까 ?
아직은 잘 모르겠지만 성능에서의 차이점은 있다.
기본적으로 기능은 같기 때문에 클래스내의 메소드들의 시간복잡도는 같지만,
Thread-safe 클래스들의 경우 쓰레드 간의 동기화 lock작업에 시간이 더 필요하기 때문에 non-thread-safe 클래스들 보다 성능이 떨어진다.
성능차이
싱글스레드에서의 연산처리 속도를 찾아보았다.
아래의 두 블로그에서 Thread-safe한 클래스와 그렇지 않은 클래스의 성능비교를 그래프로 확인할 수 있다.
(두 링크 모두 대략 2배정도의 속도차이를 보인다.)
단일스레드이거나 동기화를 고려하지 않아도 되는 상황이라면, 확실히 StringBuilder나 HashMap같은
non-thread-safe 클래스들을 사용하는것이 더 좋아 보인다.
또 다른 Thread-safe 클래스?
대표적으로 Vector와 ArrayList를 비교해 볼 수 있다.
(Vector를 상속받는 Stack클래스도 있다!)
Vector가 thread-safe이고 ArrayList가 non-thread-safe인데, 일반적으로 Vector는 단일스레드뿐만 아니라 멀티스레드 환경에서도 잘 사용되지 않는 클래스이다.
왜 그럴까?
Vector클래스 내부코드를 보면 thread-safe 목적에 맞게 대부분의 메소드에 synchronized 키워드가 붙어있다.
그로인해 대부분의 작업에 lock이 사용되는데 get() 메소드처럼 자주 호출될 수 있는 경우, 잦은 lock으로 인해
오버헤드가 커지는 문제가 발생한다.
그래서 Vector대신 ArrayList를 사용하는 것이고 Stack대신 Deque를 사용하는 것이다.
이 외에 동기화가 필요한 상황에서 사용할 수 있는 다양한 유틸리티 클래스들을 제공하는
java.util.concurrent 패키지가 있다.
참고해 볼 링크
'개발 공부 > Java' 카테고리의 다른 글
[Java] HashMap과 HashTable의 동작 방식 (0) | 2022.02.23 |
---|---|
[Java] Object클래스 - equals, hashCode, toString 메소드 (0) | 2021.08.09 |
[Java] String, StringBuffer, StringBuilder 차이점 (0) | 2021.08.09 |
[Java] String클래스와 String Constant Pool (0) | 2021.08.06 |