스레드는 프로그램 내에서, 특히 프로세스 내에서 실행되는 흐름의 단위를 의미한다.
프로그램 환경에 따라 둘 이상의 스레드를 동시에 실행하는멀티 스레드 환경을 구성할 수 있다.
이로써 병렬성을 이용하여 복잡한 애플리케이션의 성능을 향상시킬 수 있다.
하지만 멀티 스레드 환경에서는
공유된 자원에 접근하는 여러 스레드를 잘 관리해야 하며,
동기화도 신경쓰는 등 여러모로 잘 사용해야한다.
이전에 Immutable 객체에 대해서 한 번 공부한 적이 있다. [Java의 String]
Immutable(불변)객체란 객체가 선언된 이후로는 변경할 수 없는 객체를 의미한다.
자바에서는 대표적으로 String이 있다.
String은 기본적으로 스레드에 안전하다.
Immutable 객체를 만드는 기본적인 방법은
setter를 구현하지 않고 생성자가 private으로 선언되어있으며,
모든 멤버변수들은 final로 선언하는 것이다.
Immutable 객체 생성에 대한 자세한 내용은 나중에 따로 정리하여 작성해야겠다.
자바에서 Thread-safe를 보장하는 쉽고 간편한 방법으로,
바로 synchronized 키워드를 사용하는 방법이다.
메서드에 synchronized 키워드를 사용함으로써
여러 스레드가 동시에 메서드에 접근하더라도 단 한개의 스레드만 보장한다.
이는 멀티 스레드 환경에서 싱글톤 패턴을 적용할 때 다뤘었다.
synchronized을 사용하는 방법의 가장 큰 단점은
좋은 성능을 보장하기가 어렵다는 것이다.
따라서 가능하다면 자바에서 제공하는 자료구조를 사용하는게 더 좋다.
대표적으로 Hashtable, ConcurrentHashMap, AtomicInteger, BlockingQueue
등등이 있다.
동시성 관련된 자료구조를 사용하는 방법은 좋은 방법이지만
어떤 자료구조를 사용하느냐에 따라서 성능이 조금 떨어질 수도 있다.
stack에 한정되도록 프로그래밍하는 방법이다.
스레드는 위에서 설명한것과 같이 프로세스에 할당된 자원을 공유하지만,
각 스레드는 각기 별도의 스택과 지역변수를 갖도록 되어 있다.
따라서 모든 스레드는
각자 고유한 스택과 지역변수를 가진다는 특성을 잘 이해하면 동시성을 보장하도록 할 수 있다.