Blocking 과 Non-bloc, Sync 와 Async

twocowsong·2023년 6월 10일
0

https://www.youtube.com/watch?v=IdpkfygWIMk
우테코 발표내용을 보고 정리한 내용입니다.

Block & Non-block

Block 과 Non-Block 핵심은 제어권에 있습니다.
아래와같은 예제 코드가있습니다.

function 함수1() {
	functionA();
  	functionB();
  	functionC();
}

function functionA() {
	/*~~~~~~ 로직 ~~~~~~*/
  return something;
}

function functionB() {
  
}

function functionC() {
  
}

block

  1. '함수1'이 호출됩니다. 이때 제어권은 '함수1'에 있습니다.
  2. functionA 함수가 호출됩니다. 이때 제어권은 'functionA'로 넘어가게 됩니다.
  3. 2번에 경우 제어권이 functionA로 넘어가기때문에 호출자('함수1')은 아무것도 할 수 없습니다.
  4. 호출자('함수1')에 행동을 막음으로써 'block'이라고 할 수 있습니다.
  5. functionA에 return값 somthing이 함수1.functionA();에 리턴됩니다.
  6. 함수1에 functionA에 대한 리턴을 받음으로써 그 다음인 functionB가 실행될 수 있습니다.

Non-block

  1. 함수1이 호출됩니다. 이때 제어권은 '함수1'에 있습니다.
  2. functionA함수가 호출됩니다. 이때 제어권은 '함수1'에 있습니다.
  3. 2번에 제어권은 '함수1'에있지만, functionA함수는 계속 실행됩니다.
  4. 3번에 functionA함수가 계속 실행되지만, '함수1'에 제어권은 functionB를 실행시킵니다.
  5. 이렇게 functionA가 리턴을 하지도않았지만, 계속적으로 functionB, functionC가 실행됩니다.

Sync & Async

Synchronous = Syn(함께) + Chrono(시간)
어떤 대상들의 시간이 일치하는지, 시간대를 가져가서 같은 결과(데이터)를 가지고있는지를 확인합니다.
이때 어떤 대상인지? 어떤 시간대인지?

위에서 사용했던 함수를 다시 봅시다.

function 함수1() {
	functionA();
  	functionB();
  	functionC();
}

function functionA() {
	/*~~~~~~ 로직 ~~~~~~*/
  return something;
}

function functionB() {
  
}

function functionC() {
  
}

Sync

제어권과 결과값을 반환하는게 같은것을 Sync라고 합니다.

순서 : 함수1() - functionA(제어권&결과값 반환) - functionB(제어권&결과값 반환) - functionC(제어권&결과값 반환) - 종료
이렇게 순서가 정해진것, 이것도 동기화에 일종입니다.

자바에서 멀티스레드 환경에서 쓰레드에 종료시간을 맞춰주는 메서드 'Thread.join()'에 경우에도, 동기화에 일종입니다.

Thread thread = new Thread(new Runnable() {
    public void run() {
        // 쓰레드 동작 내용
    }
});

// 쓰레드 시작
thread.start();

// 쓰레드 종료를 기다림
try {
    thread.join();
} catch (InterruptedException e) {
    // 예외 처리
}

위의 코드에서 thread.join()은 호출한 쓰레드가 thread 쓰레드가 종료될 때까지 기다립니다.
join() 메서드는 InterruptedException을 던질 수 있으므로 해당 예외를 처리해야 합니다.

이렇게 join() 메서드를 사용하면 다른 쓰레드들이 해당 쓰레드의 종료를 기다릴 수 있습니다.

Async

Sync와 반대로 종료시간대가 일치하지 않거나, 결과값도 안됐는데 제어권을 반환한다거나(Non-block)


문득 이렇게 설명을 들으면
Block == Sync, Non-Block == Async처럼 들리겠지만
이부분은 보는 관점이 다릅니다.
Block, Non-Block 는 제어권에 관련된 내용입니다.
Sync, Async는 제어권을 반환하는 시간과 타이밍에 대한 내용입니다.

이처럼 묘한 연관이되어있으며, 실제 개발시에는 이런 묘한 연관관계를 잘 이용합니다.

// 비동기 작업 실행
Future<Integer> future = executor.submit(callable);
        
System.out.println("작업 시작");

// 작업 완료를 기다림
while (!future.isDone()) { // 엄청 오래걸리는 작업 시작
	System.out.println("작업 진행 중...");
	Thread.sleep(500); // 잠시 대기
}

// 작업 완료 후 결과 획득
int result = future.get();
System.out.println("작업 결과: " + result);

위처럼 예제 소스코드가 있을때
1. future.isDone()에 함수를 호출하여 작업이 끝났는지 안끝났는지 확인합니다.
2. 작업이 끝나지 않았을경우 while문 안에있는 내용이 실행됩니다.
3. while문 내용이 끝난 후 future.isDone()을 호출하여 작업이 끝났는지 안끝났는지 확인합니다.
4. 끝나지 않았을경우 다시 2번과 3번을 반복합니다.
5. 언제까지? future.isDone()함수에 작업이 끝날때 까지...

위와 같은 소스코드가 있을경우 이건 동기일까요? 비동기일까요?

Future에서 비동기/논블로킹으로 작업이 실행되어
while문은 동기로 함수가 끝났는지 않끝났는지 확인합니다.
(끝나지 않았어도, 끝나지 않았다는 상태값을 리턴하기에 동기입니다.)
이렇게 작업이 완료될때까지 기다린 후 future.get();으로 결과값을 받을때까지 기다립니다.
이때는 동기/블러킹으로 값을 기다립니다.

이렇게 4가지 상황 (Block, Non-Block, Sync, Async)을 확실하게 나눌수가 없습니다.
이런 각박한 코딩 세상속 모든것을 나누려고 하지말구, 개념만 이해해보져.

블락과 논블락은 제어권을 누가가지고 언제 반환하는지, 제어할 수 없는 대상을 어떻게 처리할지에 대한 내용
싱크와 어싱크는 제어권을 반환하는 시간, 결과값을 반환하는 시간, 다음 함수가 시작하는 시간에 그게 일치가 되는지에 대한 내용

profile
생각하는 개발자

0개의 댓글