출처: http://kiwi99.tistory.com/18

  • Thread 동기화(Synchronization) 필요한가?
    • 멀티스레드 프로그램을 하게 되면 스레드 간의 데이터를 공유할 필요가 종종 발생하게 된다. 가령 정보를 생산하는 스레드가 있고(생산자 스레드) 정보를 소비하는 스레드(소비자 스레드) 있다면 사이에는 정보(데이터) 공유해야할 필요가 있다. 따라서 공유하는 메모리 영역에 정보가 위치하고 각각의 스레드가 접근하여 각자의 작업을 수행하게 된다.
    • 문제는 공유영역에 대한 접근을 적절히 조절하지 않으면 공유데이터의 데이터 일관성(Consistency)문제 비효율적인 공유데이터 접근 문제가 발생 있다. 가령 아래와 같은 문제가 발생하는 상황을 생각해 있다.
      • 생산자 스레드가 정보를 생성하고 있는 과정에서 아직 완료되지 않은 정보를 소비자 스레드가 가져갈 있는 상황
      • 생산자 스레드가 정보를 생성하지 않았는데 이를 소비가 스레드가 알지 못하여 불필요하게 정보에 접근하려는 상황
    • 따라서 위와 같은 문제가 발생하지 않도록 스레드 간에 동시에 접근 가능한 공유영역에 대하여 적절한 접근제어 접근순서를 컨트롤 해주는 작업을 동기화(synchronization)라고 한다.
    • 동기화 관련하여 임계영역(Critical Section)이라는 용어를 자주 접할 있는데, 임계영역의 의미는 이상의 스레드가 공유데이터(영역) 동시에 접근하여 문제가 발생할 있는 코드 영역 의미한다. 따라서 해당 코드 영역에 , 후에 적절한 동기화 처리 로직을 추가하여 동기화 처리를 하게 된다.
    • 스레드 동기화 처리를 한다는 것은 임계영역의 진입, 진출 시에 적절한 동기화 처리 로직을 추가하여 경쟁상태(race condition) 있는 스레드 간의 공유데이터에 대한 안전하고 효율적인 접근을 보장해주는 것이라고 있다.
    • 정리해 보면, 스레드 동기화 처리를 한다는 것은 다음 2가지 작업을 의미한다.
      • Mutual Exclusion(상호배제)
        • 상호배제라는 것은 이상의 스레드가 임계영역에 동시에 접근하는 것을 막는 말한다.
        • 다수의 스레드가 데이터를 공유할 서로 간섭 없이 접근하고자 필요하다.
      • Cooperation(협력)
        • 멀티스레드 공유데이터의 동시접근을 막을 뿐만 아니라 접근 순서도 컨트롤 하는 말한다.
        • 같은 목적을 가진 스레드간에 협력해서 효율적으로 작업할 있도록 하겠다는 의미이다.
        • 생산자-소비자 스레드를 생각해보면 단순히 상호배제만을 해서 부족하다. 동시접근도 차단하고 생산자스레드가 생산을 했을 소비자 스레드에게 이를 알려서 작업을 있도록 주는 것이 필요하다. 이런 것이 바로 스레드간 협업이다.
  • 일반적인 동기화 처리 방식
    • 출처 참조
  • Critical Section(임계구역)
    • 이상의 Thread 공유데이터(영역) 동시에 접근하여 문제가 발생할 있는 코드 영역
    • 만약 서로 다른 접근을 허용한다면 병목현상이 발생할 있고, 하나의 스레드가 계속 접근한다면 Dead Lock 발생할 있다.
  • Java 동기화
    • Thread Critical Section 실행하고 있을 다른 Thread 접근을 막는 .
    • 동기화 방법
      • 동기화 블록지정: synchronized(sharedArea){ 실행문(critical section) }
      • 동기화 메소드: synchronized void increaseNum(int num){ 실행문(critical section) }
,