[JAVA] 멀티스레드 환경에서 문제와 대책

2024. 2. 26. 16:23Web/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