[F-lab 모각코 챌린지 53일차] TIL

JeongheeKim·2023년 7월 23일

TIL

목록 보기
53/66

학습계획


  • 동기, 비동기/ 블록킹, 논블록킹
  • Type Inference(타입 추정)
  • Setter 주입 방식
  • 프로세스 동기화(synchronization)

Today I Learned


동기와 비동기는 응답을 요청함에 있어 순서결과에 관심이 있는지로 판단할 수 있다.

동기(Synchronous)

작업을 동시에 수행하거나, 동시에 끝나거나, 끝나는 동시에 시작함을 뜻함

→ ProcessA는 ProcessB의 요청을 하고 요청에 대한 응답이 올때까지 대기한다. ProcessB의 일이 끝나면 ProcessA의 작업을 재개한다.

비동기(Asynchronous)

작업의 시작, 종료가 일치하지 않으며, 끝나는 동시에 시작을 하지 않는것을 의미

→ ProcessA는 ProcessB의 요청을 하고 요청에 대한 응답 여부에 상관없이 ProcessA의 작업을 계속 진행한다. ProcessB의 일이 끝나면 ProcessA의 작업을 재개한다.

다른 주체가 작업을 할때 자신의 제어권이 있는지 없는지로 확인할 수 있다.

Blocking

ProcessorA가 요청한 작업에 대한 ProcessorA의 응답이 돌아올때까지 대기하는것ProcessorB로 부터온 응답이 꼭 필요하고 이 응답값으로 ProcessorA의 다음 job을 수행해야한다.

Non-Blocking

다른 주체의 작업에 관련없이 자신의 작업을 하는 것


Type Inference(타입 추정)

메서드의 리턴 타입이나 매개 변수의 타입을 자동으로 컴파일 시 타입을 추정하여 결정하는것

함수형 인터페이스의 추상 메서드에 의해 예상되는 매개 변수의 타입을 추론할 수 있기때문에 리턴 타입이나 매개 변수의 타입을 생략할 수 있다.

public final class Test {

    public static void main(String[] args) {
        //MyFuntionalInterface mfi = (int a) -> { return a * a; };
        MyFunctionalInterface mfi = a -> a * a;
        int b = mfi.runSomething(5);
        System.out.println(b);
    }

}

@FunctionalInterface
interface MyFunctionalInterface {
    public abstract int runSomething(int count);
}

  • setter 주입방식은 생성할 객체에 주입이 필요한 객체들이 주입되지 않아도, 생성할 객체가 생성이 가능하여 NullPointerException의 위험이 있다.

Setter 주입 방식

SetterInjection클래스는 Pojo클래스를 Setter를 통해 객체를 주입하였다. SetterInjection클래스는 Pojo클래스를 주입하지 않아도 객체 생성이 가능하다. SetterInjection의 객체가 생성된다는것은 getPojo() 호출할 수 있다는것인데, 이는 주입되지 않은 Pojo객체를 호출하므로 NullPointerException을 발생 시킨다.

public class Pojo {
    public String getName() {
        return "hello world";
    }
}
public class SetterInjection {
    private Pojo pojo;

    public void setPojo(Pojo pojo) {
        this.pojo = pojo;
    }

    public String getPojo() {
        return pojo.getName();
    }
}
public class Main {
    public static void main(String[] args) {
        SetterInjection setterInjection = new SetterInjection();
        setterInjection.getPojo();//Exception in thread "main" java.lang.NullPointerException
    }

}

프로세스 동기화(synchronization)란?

프로세스들 사잉의 수행 시기를 맞추는것

동기화가 필요한 상황들

  • 실행 순서 제어
    • 프로세스를 올바른 순서대로 실행
  • 상호 배제(mutual exclusion)
    • 동시에 접근해서는 안되는 자원에 하나의 프로세스만 접근하게 하는것

→ 프로세스 뿐만 아니라 스레드도 동기화의 대상이다. 실행의 흐름을 갖는것은 모두 동기화의 대상이다.

  • 공유자원(shared resource) 공동으로 이용하는 변수, 파일, 장치등을 공유자원이라고 한다.
  • 임계 구역(critical section) 공유 자원에 접근하는 코드 중 동시에 실행하면 문제가 발생하는 코드 영역을 임계 구역이라 한다.
    • 레이스 컨디션(race condition)
      • 임계 구역은 두 개 이상의 프로세스가 동시에 실행되면 안되는 영역이지만, 잘못된 실행으로 인해 프로세스가 다발적으로 임계구역에서 실행되어 문제가 되는 현상

1개의 댓글

comment-user-thumbnail
2023년 7월 23일

많은 도움이 되었습니다, 감사합니다.

답글 달기