String은 불변

public final class String implements java.io.Serializable, Comparable {
	private final byte[] value;
}

StringBuffer/StringBuilder는 가변

2-1. thread safe

Thread-safe를 지키기 위한 방법

  1. Re-entrancy(재진입성)

어떤 함수가 한 스레드에 의해 호출되어 실행 중일 때, 다른 스레드가 그 함수를 호출하더라도 그 결과가 각각에게 올바로 주어져야 한다.

  1. Thread-local storage(TLS)

공유 자원의 사용을 최대한 줄여 각각의 스레드에서만 접근 가능한 저장소들을 사용함으로써 동시 접근을 막는다.

이 방식은 동기화 방법과 관련되어 있고, 또한 공유상태를 피할 수 없을 때 사용하는 방식이다.

  1. Mutual exclusion(상호배제)

공유 자원을 꼭 사용해야 할 경우 해당 자원의 접근을 세마포어 등의 락으로 통제한다.

  1. Atomic operations

공유 자원에 접근할 때 원자 연산을 이용하거나 '원자적'으로 정의된 접근 방법을 사용함으로써 상호 배제를 구현할 수 있다.

<aside> 💡 원자적 연산이란?

중단되지 않는 연산 여러 쓰레드가 공용 자원을 동시에 접근하는 것을 데이터 레이스라고 한다. 이를 막기 위해 먼저 실행된 쓰레드가 커밋이 된 후 다음 쓰레드가 데이터를 읽고 변경할 수 있다.

</aside>