[JAVA] 멀티스레드 환경에서 문제와 대책
2024. 2. 26. 16:23ㆍWeb/JAVA
1. Thread
- 프로그램이 실제로 실행되어, 메모리나 CPU와 같은 자원을 할당 받으면 이를 프로세스라고 부른다.
- 스레드는 프로세스 내에서 실제로 작업을 수행하는 한 단위
- 모든 프로세는 하나 이상의 스레드가 존재하고, 두개 이상의 스레드를 낮는 프로세스를 멀티 스레드 프로세스라고 한다
- 프로세스는 독자적으로 메모리를 할당받아 서로의 메모리를 공유할수 없지만, 프로세스 내부의 스레드는 같은 자원을 공유하여 사용이 가능하다.
- 여러 스레드를 사용하여 병렬 프로그래밍을 하게되면 웹 서버에서는 빠른 응답이 가능하다는 장점이 있다.
- 여러 스레드가 하나의 자원을 공유하고 있기 때문에 스레드 간 경쟁상태가 발생할수 있고, 이는 동시성 문제
2. 동시성 문제 해결
- 암시적 Lock 사용
- 가장 간단하면서 쉬운방법
- Lock을 걸게되면 스레드의 공유자원에 대한 독점을 허용하기때문에 다른스레드는 대기
- 하나의 스레드만 사용하기때문에 병렬성이 낮아지고 느려진다.
- 자바에서는 synchronized 키워드를 사용하여서 구현
- 명시적 Lock 사용
- synchronized 키워드를 사용하지않고 Lock 인터페이스를 이용
- Lock객체의 lock() 메소드를 호출하여 잠그고, unlock() 메소드를 호출하여 잠금을 해제한다.
- volatile 사용
- violatile 키워드를 사용하여 변수가 항상 메인메모리에서 읽고 쓰이도록 보장
- violatile 키워드를 변수에 붙여주면, 해당 변수는 캐시에 저장되지않고, 메인메모리에 항상 저장
- Concurrent 패키지 사용
- 자바에서 제공하는 Concurrent 패키지로 동시성 문제 해경
- ConcurrentHashMap을 사용하면 내부적으로 스레드 간의 안전한 데이터 공유를 보장
- 불변 객체 사용
- 불변 객체는 상태가 변경될 수 없는 객체이기 때문에 Thread-safe하다.
- final 키워드로 클새스와 변수를 선언하여 변경할 수 없도록 만들어 반드시 생성자를 통해서 초기화 가능
'Web > JAVA' 카테고리의 다른 글
[JAVA] 에러(Error) 와 예외 클래스(Exception) (0) | 2024.03.13 |
---|---|
[JAVA] 추상클래스(Abstracat) (0) | 2024.03.07 |
[JAVA] equals(), hashCode() (1) | 2024.02.26 |
[JAVA] 컴파일 과정 (0) | 2024.02.26 |
[JAVA] String / StringBuffer / StringBuilder (0) | 2024.02.23 |