본문 바로가기
Web/Java

Java(31) - 멀티스레드2

by SeleniumBindingProtein 2022. 1. 28.
728x90
반응형

1. multi-threading 
    1) 여러 thread가 동시에 수행되는 프로그래밍. 여러 작업이 동시에 실행되는 효과.
    2) thread는 각각 자신만의 작업 공간을 가짐 : context 
    3) 각 thread 사이에는 공유하는 자원이 있을 수 있음 (자바에서는 static instance)
    4) 여러 thread가 자원을 공유하여 작업이 수행되는 경우
       서로 자원을 차지하려는 race condition이 발생할수 있음.
    5) 이렇게 여러 thread가 공유하는 자원 중 경쟁이 발생하는 부분을 critical section 이라함.
    6) critical section에 대한 동기화(일종의 순차적 수행)를 구현하지 않으면 오류가 발생할수 있음.   

2. Thread Status (스레드 상태)

3. join()


    1) 다른 스레드의 종료를 기다림.
    2) 동시에 두 개 이상의 Thread가 실행 될 때 
       다른 Thread의 결과를 참조하여 실행해야하는 경우 join() 함수를 사용함.
    3) join() 함수를 호출한 Thread가 not-runnable 상태가 됨.
    4) 다른 Thread의 수행이 끝나면 runnable 상태로 돌아옴.

4. interrupt()
    1) 다른 Thread에 예외를 발생시키는 interrupt을 보냄.
    2) Thread가 sleep(시간), wait(), join() 함수에 의해 Not Runnable 상태일때,
       interrupt() 메서드를 호출하면 다시 Runnable 상태가 될수 있음.  

5. Thread 종료하기
    1) 무한 반복의 경우 while(flag)의 flag 변수값을 false로 바꾸어 종료를 시킴.

6. 멀티 Thread 프로그래밍에서 동기화


    1) critical section : 두개 이상의 thread가 동시에 접근하는 경우 문제가 생길수 있기
                          때문에 ==> 동시에 접근할수 없게 해야함.
    2) 한 순간 오직 하나의 thread만이 공유자원을 얻을수 있고, 
       나머지 thread들은 대기(blocking) 상태가 됨.

7. 동기화 (synchronization)
    1) 두 개의 thread가 같은 객체에 접근할 경우, 동시에 접근함으로써 오류가 발생.
    2) 동기화는 임계영역에 접근한 경우 공유자원을 lock하여 다른 thread의 접근을 제어.
    3) 동기화를 잘못 구현하면 deadlock에 빠질수 있음.      

8. 자바에서는 synchronized 메서드나 synchronized 블럭을 사용     
    1) synchronized 블럭
        - 현재 객체 또는 다른 객체를 lock으로 만듦.
          synchronized(참조형 수식) {
             수행문;
          }
    2) synchronized 메서드
        - 객체의 메서드에 synchronized 키워드 사용.
        - 현재 이 메서드가 속해있는 객체에 lock을 검.      
                              
9. wait() / notify(), notifyAll() 메서드를 활용한 동기화 프로그래밍


    1) 리소스가 어떤 조건에서 더 이상 유효하지 않은 경우 리소스를 기다리기 위해 
       Thread가 wait() 상태가 됨. (Not Runnable)
    2) wait() 상태가 된 Thread은 notify()가 호출될 때까지 기다림.
    3) 유효한 자원이 생기면 notify() 호출되고 
         wait()하고 있는 Thread 중 무작위로 하나의 Thread를 재시작 하도록 함. (Runnable)
    4) notifyAll()이 호출되는 경우 wait()하고 있는 모든 Thread가 재시작 됨.     
        - 이 경우 유효한 리소스만큼의 Thread만이 수행될수 있고 
          자원을 갖지 못한 Thread의 경우는 다시 wait() 상태로 만듦.
        - notifyAll() 메서드의 사용을 권장.  

728x90
반응형

'Web > Java' 카테고리의 다른 글

Java(32) - WebSocket  (0) 2022.02.09
Java(30) - review4  (0) 2022.01.28
Java(28) - IO입출력  (0) 2022.01.28
Java(27) - 예외처리  (0) 2022.01.28
Java(26) - Stream  (0) 2022.01.28

댓글