• 스레드
    • 스레드(thread)란 프로세스(process) 내에서 실제로 작업을 수행하는 주체를 의미

      Untitled

    • CPU의 코어1개당 1개의 Processor가 동작

    • 모든 프로세스에는 한 개 이상의 스레드가 존재

    • 프로세서는 주어진 task(thread)를 빠르게 동작하며 순차적으로 처리

      • 다만 처리 속도가 빠르기에 multi tasking이라고 봐도 무방
  • 스레드의 동작
    • java에서 기본적으로 프로그램이 실행되면 1개의 스레드가 동작
      • main함수를 통해 thread 시작
      • 신규로 추가 스레드를 만들려면 별도로 생성해야 함
    • 두 개 이상의 스레드를 가지는 프로세스를 멀티스레드 프로세스라 칭함
    • 멀티스레드는 비동기적으로 동작
      • 하나의 스레드가 작업을 할 때 다른 스레드가 독립적으로 작업을 수행
      • 즉, 두 개 이상의 스레드가 동시에 동작하는 것(사실은 동시에 동작하는 것 처럼 보이는 것)
  • 스레드의 생성과 실행
    • 자바에서는 기본 스레드외에 스레드를 추가 생성하는 방법에는 다음과 같이 두 가지 방법이 존재
      • Runnable을 구현한 객체를 Thread클래스 생성자에 주입하여 스레드 생성
      • Thread 클래스를 상속한 객체를 통해 스레드 생성
    • 예시
      • Thread th = new Thread(new Runnable() { @Override public void run() { System.out.println("thread first "+Thread.currentThread().getName()); }}); th.start();
  • 주요메서드
    • run()
      • 최초의 Thread 클래스에의 run 메서드는 아무 작업도 수행하지 않는 빈 메서드
      • run메서드는 스레드 생성 및 실행시 자동 호출
      • 실제 실행 로직은 run을 오버라이드하여 직접 작성
    • start()
      • start를 통해 스레드 실행
  • 멀티스레드
    • 두 개 이상의 스레드를 가지는 프로세스는 멀티스레드 프로세스
    • 컴퓨터에서 동시에 처리할 수 있는 최대 작업 수는 CPU의 코어(core) 수와 같다
      • 멀티 스레드 실행시 코어가 정해진 시간 동안 여러 작업을 번갈아가며 수행
      • 실행 대상인 각 스레드가 교체될 때 프로세스내의 스레드 문맥교환발생
        • 문맥 교환이란 현재까지의 작업 상태 저장
        • 그래서 단순한 계산의 경우엔 싱글 스레드로 동작하는 것이 더 효율적
    • 또한 동시에 실행되는 2개 이상의 쓰레드 때문에, 데이터의 동시성 문제가 필연적으로 발생
    • 멀티스레드 프로그래밍에서는 동기화 작업이 필수
      • 여러 쓰레드가 동일한 리소스를 공유하여 사용하게 되면 실행의 결과가 동일 리소스에 영향을 주기 때문에 이를 방지하는 기법
  • 멀티스레드의 동시성문제 해결
    • 순수 java 프로그래밍에서 join() 또는 syncronized를 통한 동시성 이슈 해결
    • join()
      • 한 스레드가 완료될때까지 다른 스레드의 start를 하지 않도록 할 때 사용
      • 사실상 비동기가 아닌 동기처럼 움직이므로, 주의해서 사용해야함
    • syncronized
      • 경쟁 조건(race condition)이 발생할 수 있는 코드 영역을 보호할때 사용
      • 예시) public synchronized void borrowBook(){ 실행문; }
      • 즉, synchronized 블록의 메서드는 한 번에 하나의 스레드만 실행
  • 스프링과 DB를 활용한 웹개발에서의 멀티스레드와 동시성문제
    • 멀티스레드 관리의 어려움
      • 스프링에서는 멀티스레드를 직접 생성하여 관리하기 보다는 스프링에게 관리 위임
    • 웹 개발에서의 멀티스레드의 동시성 문제
      • 여러 스레드가 DB의 data를 조회, 수정 함으로서 발생하는 이슈
        • 예를 들어)쇼핑몰의 남은 재고가 1일때, 여러 스레드가 동시에 구매를 하였을때 재고가 마이너스가 될 수 있는 이슈
      • 스프링을 통한 DB동시성 이슈 해결 방안
        • pessimistic read(비관적 읽기)
          • 기본적으로 동시성 이슈가 발생할것이라고 비관적으로 보고 엄격한 정책을 적용
          • 이 방식에서는 데이터를 읽을 때 해당 데이터에 락을 걸어 다른 트랜잭션들이 해당 데이터를 수정하거나 삭제할 수 없도록 하는 것.
        • optimistic read(낙관적 읽기)
          • 이 방식에서는 데이터를 읽을 때 락을 걸지 않고, 데이터를 업데이트할때 데이터가 변경됐는지를 check함으로서 만약 이미 변경이 되었다면, 트랜잭션을 재시도하거나 오류를 반환