Thread safe란?
멀티 스레드 프로그래밍에서 어떤 함수나 변수, 혹은 객체가 여러 스레드로부터 동시에 접근이 이루어져도 프로그램의 실행에 문제가 없음을 말한다.
하나의 함수가 한 스레드로부터 호출되어 실행 중일 때, 다른 스레드가 그 함수를 호출하여 동시에 함께 실행되더라도 각 스레드에서의 함수의 수행 결과가 옳바르게 나오는 것을 말한다.
Thread safe를 지키는 방법
Mutual exclusion (상호 배제)
- 공유자원에 하나의 스레드만 접근할 수 있도록, 세마포어/뮤텍스로 락을 통제하는 방법
- 세마포어: 현재 공유자원에 접근할 수 있는 스레드, 프로세스의 수를 나타내는 값을 두어 상호배제를 달성하는 기법
- 뮤텍스: 한 스레드, 프로세스에 의해 소유될 수 있는 key를 기반으로 한 상호배제기법
Atomic operation (원자 연산)
- 공유자원에 원자적으로 접근하는 방법
- 공유자원 변경에 필요한 연산을 원자적으로 분리한 뒤, 실제로 데이터 변경이 이루어지는 시점에 Lock을 걸고, 데이터를 변경하는 동안 다른 스레드의 접근이 불가능하도록 하는 방법
Thread-local storage (스레드 지역 저장소)
- 공유자원의 사용을 최대한 줄이고, 각각의 스레드에서만 접근 가능한 저장소들을 사용함으로써 동시 접근을 막는 방법
- 이 방법은 동기화 방법과 관련되어 있고, 또한 공유상태를 피할 수 없을 때 사용하는 방법이다.
Re-entrancy (재진입성)
- 어떤 함수가 한 스레드에 의해 호출되어 실행 중일 때, 다른 스레드가 그 함수를 호출하더라도 그 결과가 각가에게 올바로 주어져야 한다.
StringBuilder와 StringBuffer
- 자바에서 String은 불변객체로 String객체끼리 더하는 연산은 새로운 String을 생성하며, 메모리 할당과 메모리 해제를 발생시켜 더하는 연산이 많아지면 성능적으로 좋지 않게된다.
- 그래서 StringBuilder와 StringBuffer가 나오게 되었다. StringBuilder와 StringBuffer는 문자열을 더할 때 새로운 객체를 생성하는 것이 아니라 기존의 데이터에 더하는 방식을 사용한다.
- StringBuffer클래스와 StringBuilder클래스의 차이는 동기화 지원의 유무로, StringBuffer는 각 메서드별로 Synchronized Keyword가 존재하여 멀티스레드 환경에서도 동기화를 지원한다.
- 자바에서 Synchronized Keyword는 여러개의 스레드가 하나의 자원에 접근하려고 할 때, 현재 데이터를 사용하고 있는 스레드를 제외하고 나머지 스레드들이 데이터에 접근할 수 없도록 막는 역할을 수행한다.
- String: 변하지 않는 문자열을 자주 사용할 경우 적합
- StringBuilder: 단일 스레드 환경, 문자열의 추가, 수정, 삭제 등이 빈번하게 발생하는 경우 적합
- StringBuffer: 멀티 스레드 환경, 문자열의 추가, 수정, 삭제 등이 빈번하게 발생하는 경우 적합
[참고자료]
세마포어, 뮤텍스
Thread safe
StringBuilder와 StringBuffer차이
StringBuilder 쓰는이유