- 무엇과 무엇이? 어떤 시간을? 이 두가지를 함께 고려해야한다
- 동기란 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(); 은 동기/블로킹이다.
+ 메소드 리턴시간과 결과를 가져오는 시간이 일치
+ 다른 쓰레드의 작업이 완료될 때까지 대기
<참고>