brunch

You can make anything
by writing

C.S.Lewis

by myner Apr 28. 2019

동기? 비동기? 블록킹? 논블록킹?

@ 동기 / 비동기

- 무엇과 무엇이? 어떤 시간을? 이 두가지를 함께 고려해야한다

- 동기란 A와 B가 시작시간 또는 종료시간이 일치하면 동기이다.

    * A, B쓰레드가 동시에 작업을 시작하면 동기(CyclieBarrier)

    * 메소드 리턴시간(A)과 결과를 전달받는 시간(B)이 일치하면 동기

    * A가 끝나는 시간과 B가 시작하는 시간이 같으면 동기(synchronized, BlockingQueue)


@ 록킹 / 논블록킹

- 동기, 비동기와는 관점이 다름

- 내가 직접 제어할 수 없는 대상을 상대하는 방법

- 대상이 제한적이다

    * IO

    * 멀티스레드 동기화

- 내가 어떤 메소드를 호출해서 뭔가를 가져와야하는데 받아와야하는 데이터의 소스자체가 내가 통제하지 못하는 외부의 제 3의 존재로부터 인풋을 받는다? IO를 받는다면 이럴때 블로킹/ 논 블로킹 얘기를 할 수 있다.

- 나 말고 다른 스레드가 존재해서 작업을 하다가 어느순간의 그 스레드로부터 결과를 받거나 스레드가 종료하는거를 확인하고 넘어가야할때 이럴때 블로킹/ 논 블로킹을 얘기할 수 있다.


- 예

ExcutorService es = Excutors.newChachedThreadPool();

String res = es.submit(() -> "Hello").get();

    * es.submit(() -> "Hello")는 비동기이다

        + 메소드 리턴시간과 Callable의 실행결과를 받는 시간이 일치하지 않음

        + 블로킹, 논블로킹을 고려할 대상이 아니다.

        + 뭔가를 기다릴 대상이없다.

    * .get(); 은 동기/블로킹이다.

        + 메소드 리턴시간과 결과를 가져오는 시간이 일치

        + 다른 쓰레드의 작업이 완료될 때까지 대기




<참고>

https://www.youtube.com/watch?v=HKlUvCv9hvA

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari