티스토리 뷰

반응형

 

 

 

 

 

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 패키지가 있다.

 


참고해 볼 링크

 

 

 

 

반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함